मेरे पास कॉलम के साथ डेटाफ्रेम है जिसमें मानों की सूचियां हैं:

dt
   onset_l  coda_l
1     3, 7 7, 4, 1
3        7 7, 1, 3
12    1, 7 7, 4, 1
21    6, 7 7, 4, 1
23       7 7, 1, 5

मैं जो करना चाहता हूं वह एक नया कॉलम बनाना है, कहें, coda_flag, जो ध्वजांकित करता है कि कॉलम coda_l में मान उत्तरोत्तर घटते हैं या नहीं।

मैंने यह lapply तरीका आजमाया है:

dt$coda_flag <- lapply(dt$coda_l, function(x) ifelse(x[1] > x[2] & x[2] > x[3], 1, 0))

आउटपुट ठीक है लेकिन मुझे नापसंद है कि मुझे x[1], x[2] आदि की गणना करनी है क्योंकि कुछ मामलों में मुझे सूचियों में मानों की सही संख्या का पता नहीं हो सकता है।

वांछित आउटपुट होगा:

dt
   onset_l  coda_l coda_flag
1     3, 7 7, 4, 1         1  # values do progressively decrease
3        7 7, 1, 3         0  # values do not progressively decrease
12    1, 7 7, 4, 1         1
21    6, 7 7, 4, 1         1
23       7 7, 1, 5         0

यह कैसे हासिल किया जा सकता है?

प्रतिलिपि प्रस्तुत करने योग्य डेटा:

dt <- structure(list(onset_l = list(c("3", "7"), "7", c("1", "7"), 
    c("6", "7"), "7"), coda_l = list(c("7", "4", "1"), c("7", 
"1", "3"), c("7", "4", "1"), c("7", "4", "1"), c("7", "1", "5"
))), row.names = c(1L, 3L, 12L, 21L, 23L), class = "data.frame")
3
Chris Ruehlemann 30 अक्टूबर 2020, 00:44

4 जवाब

सबसे बढ़िया उत्तर

आप is.unsorted() का उपयोग कर सकते हैं - हालांकि यह केवल बढ़ते क्रम का पता लगा सकता है इसलिए पहले वेक्टर को उलटना आवश्यक है।

dt$coda_flag <- +!sapply(dt$coda_l, function(x) is.unsorted(rev(as.numeric(x))))

   onset_l  coda_l coda_flag
1     3, 7 7, 4, 1         1
3        7 7, 1, 3         0
12    1, 7 7, 4, 1         1
21    6, 7 7, 4, 1         1
23       7 7, 1, 5         0

ध्यान दें कि strictly तर्क नियंत्रित करता है कि बंधे हुए मानों की स्थिति में क्या होता है।

x <- c(1, 2, 2, 3)

is.unsorted(x)
[1] FALSE

is.unsorted(x, strictly = TRUE)
[1] TRUE
2
27 ϕ 9 30 अक्टूबर 2020, 01:19

आप लूप के साथ भी कोशिश कर सकते हैं:

#Flag
dt$Flag <- NA
#Loop
for(i in 1:nrow(dt))
{
  #Extract elements
  vecvar <- do.call(c,dt$coda_l[i])
  #Compute diff
  difvec <- diff(sort(as.numeric(vecvar)))
  #Assign
  dt$Flag[i] <- ifelse(length(unique(difvec))==1,1,0)
}

आउटपुट:

dt
   onset_l  coda_l Flag
1     3, 7 7, 4, 1    1
3        7 7, 1, 3    0
12    1, 7 7, 4, 1    1
21    6, 7 7, 4, 1    1
23       7 7, 1, 5    0
0
Duck 30 अक्टूबर 2020, 00:53

एक dplyr और purrr समाधान हो सकता है:

dt %>%
 mutate(coda_flag = map_int(.x = coda_l, ~ +(all(diff(as.numeric(.x)) < 1))))

  onset_l  coda_l coda_flag
1    3, 7 7, 4, 1         1
2       7 7, 1, 3         0
3    1, 7 7, 4, 1         1
4    6, 7 7, 4, 1         1
5       7 7, 1, 5         0
1
tmfmnk 30 अक्टूबर 2020, 00:49

data.table के साथ एक विकल्प

library(data.table)
setDT(dt)[, coda_flag := +(sapply(coda_l, function(x)
   all(as.numeric(x) - shift(as.numeric(x), fill = first(as.numeric(x))) < 1)))]

आउटपुट

dt
#   onset_l coda_l coda_flag
#1:     3,7  7,4,1         1
#2:       7  7,1,3         0
#3:     1,7  7,4,1         1
#4:     6,7  7,4,1         1
#5:       7  7,1,5         0
0
akrun 30 अक्टूबर 2020, 00:58