मैं datasetA और datasetB नामक दो डेटासेट पर कुछ पुनरावृत्ति करने के लिए R में एक लूप लिखने का प्रयास कर रहा हूं।

datasetA में ६०० प्रविष्टियाँ हैं और datasetB में २००,००० प्रविष्टियाँ हैं। datasetA में प्रत्येक प्रविष्टि के लिए, मैं निम्नलिखित कार्य करना चाहता हूं:

यदि दोनों डेटासेट में V2 का मान बराबर है, फिर पीपीएम की गणना करें:

(datasetA$V3 - datasetB$V3) / datasetA$V3 * 1000000

यदि पीपीएम <|10|, तो पीपीएम मान को V4 कॉलम में datasetB में पेस्ट करें, datasetA$V1 के प्रासंगिक नाम को datasetB के कॉलम V1 में पेस्ट करें। .

कहो कि यह datasetA ६०० प्रविष्टियों के साथ है:

datasetA<- read.table(text='Alex    1   50.00042
John    1   60.000423
Janine    3   88.000123
Aline    3   117
Mark    2    79.9999')

डेटासेटए

और यह 200000 प्रविष्टियों के साथ datasetB का एक उदाहरण है:

datasetB<- read.table(text='NA    1   50.0001    NA
NA    1   50.00032    NA
NA    2   70    NA
NA    2   80    NA
NA    3   88.0004    NA
NA    3   100    NA
NA    3   101    NA
NA    2    102    NA')

डेटासेटबी

अंतिम तालिका इस तरह दिखनी चाहिए:

datasetC <- read.table(text='Alex    1   50.0001    6.459945
Alex    1   50.00032    2.059983
NA    2   70    NA
Mark    2   80    -1.25
Janine    3   88.0004    -3.14772
NA    3   100    NA
NA    3   101    NA
NA    2    102    NA')

अंतिम तालिका इस तरह दिखनी चाहिए

0
Ali 16 अगस्त 2020, 10:50

4 जवाब

सबसे बढ़िया उत्तर
data<-datasetB
for(i in 1:5){
  for(j in 1:8){
    if (datasetA$V2[i]==datasetB$V2[j] & abs((datasetA$V3[i]-datasetB$V3[j])/datasetA$V3[i]*10**6)<10){
      data[j,1]=datasetA[i,1]
      data[j,4]=(datasetA$V3[i]-datasetB$V3[j])/datasetA$V3[i]*10**6
  }}}
data
0
Jacky mak 16 अगस्त 2020, 12:22

अगर मैं सही ढंग से समझूं, तो सवाल एक जटिल स्थिति के साथ जुड़ने के लिए पूछ रहा है। इसे data.table का उपयोग करके कार्यान्वित किया जा सकता है:

library(data.table)
setDT(datasetA)[setDT(datasetB), on = "V2", {
  ppm <-(x.V3- i.V3) / i.V3 * 1E6
  list(V1 = ifelse(abs(ppm) < 10, x.V1, NA_character_), 
       V2,
       V3 = i.V3,
       V4 = ifelse(abs(ppm) < 10, ppm, NA_real_))
}, mult = "first"]
       V1 V2        V3        V4
1:   Alex  1  50.00010  6.399987
2:   Alex  1  50.00032  1.999987
3:   <NA>  2  70.00000        NA
4:   Mark  2  80.00000 -1.250000
5: Janine  3  88.00040 -3.147713
6:   <NA>  3 100.00000        NA
7:   <NA>  3 101.00000        NA
8:   <NA>  2 102.00000        NA

यहां एक वैकल्पिक तरीका दिया गया है जो datasetB को एक अपडेट जॉइन द्वारा अपडेट करता है:

library(data.table)
tmp <- setDT(datasetA)[setDT(datasetB), on = "V2"][
  , V4 := (V3- i.V3) / i.V3 * 1E6][abs(V4) < 10][, i.V1 := NULL]
datasetB[, `:=`(V1 = as.character(V1), V4 = as.double(V4))]
datasetB[tmp, on = .(V2, V3 = i.V3), `:=`(V1 = i.V1, V4 = i.V4)][]
       V1 V2        V3        V4
1:   Alex  1  50.00010  6.399987
2:   Alex  1  50.00032  1.999987
3:   <NA>  2  70.00000        NA
4:   Mark  2  80.00000 -1.250000
5: Janine  3  88.00040 -3.147713
6:   <NA>  3 100.00000        NA
7:   <NA>  3 101.00000        NA
8:   <NA>  2 102.00000        NA
0
Uwe 17 अगस्त 2020, 01:43

इसे इस्तेमाल करे: मैं एक आर नोब हूं लेकिन मुझे बताएं कि क्या यह आपके लिए काम करता है।

library(data.table)

datasetA<- read.table(text='Alex    1   50.00042
John    1   60.000423
                      Janine    3   88.000123
                      Aline    3   117
                      Mark    2    79.9999')
datasetB<- read.table(text='NA    1   50.0001    NA
NA    1   50.00032    NA
NA    2   70    NA
NA    2   80    NA
NA    3   88.0004    NA
NA    3   100    NA
NA    3   101    NA
NA    2    102    NA')

# I renamed columns for my own reference, V1,V2,.. were a bit confusing
names(datasetA) <- c("Name", "ID", "ValueA")
names(datasetB) <- c("V1", "ID", "ValueB", "V4")


# Create a key for each row in datasetB
datasetB$key <- seq(nrow(datasetB))

# Left join A to B on column ID, but first set them as data table
datasetB <- as.data.table(datasetB)
datasetA <- as.data.table(datasetA)
# Using base join but you can also use data table left join see below
datasetC <- merge(x = datasetB, y = datasetA, by = c("ID"), all.x = TRUE)

# Create PPM column
datasetC[, c("ppm") := 1000000*(ValueA - ValueB)/ValueA, ]
# Filter on PPM and keep columns we need
datasetC <- datasetC[abs(ppm) < 10, list(key,Name,ppm)]

# Left join to datasetB on key
setkey(datasetC, key)
setkey(datasetB, key)


datasetB <- datasetC[datasetB]

# Keep columns we need and rename to V1,... as requested
datasetB <- datasetB[, list(V1 = Name, V2 = ID, V3 = ValueB, V4 = ppm)]
0
user27396 16 अगस्त 2020, 11:36

निम्नलिखित उत्तर ऐसा प्रतीत होता है जो प्रश्न पूछता है लेकिन मैं गणना किए गए मानों में से 2, अंतिम कॉलम V4 प्राप्त करने में असफल रहा हूं।

AV2 <- sort(unique(datasetA$V2))
res <- lapply(AV2, function(v2){
  inx_a <- datasetA[['V2']] == v2
  inx_b <- datasetB[['V2']] == v2
  mrg <- merge(datasetA[inx_a, ], datasetB[inx_b, ], by = 'V2')
  ppm <- ((mrg$V3.x - mrg$V3.y)/mrg$V3.x)*1000000
  cbind(mrg[abs(ppm) < 10, c(2, 1, 5)], ppm = ppm[abs(ppm) < 10])
})
res <- do.call(rbind, res)
names(res) <- paste0('V', 1:4)
row.names(res) <- NULL
final <- merge(res, datasetB, by = c('V2', 'V3'), all.y = TRUE)[c(3, 1, 2, 4)]
names(final) <- paste0('V', 1:4)

final
#      V1 V2        V3        V4
#1   Alex  1  50.00010  6.399946
#2   Alex  1  50.00032  1.999983
#3   <NA>  2  70.00000        NA
#4   Mark  2  80.00000 -1.250002
#5   <NA>  2 102.00000        NA
#6 Janine  3  88.00040 -3.147723
#7   <NA>  3 100.00000        NA
#8   <NA>  3 101.00000        NA
0
Rui Barradas 16 अगस्त 2020, 12:10