r हरण सशर्त मूल्यों के साथ उत्परिवर्तन को मिलाएं




वंशागति का गुणसूत्र सिद्धांत (3)

dplyr 0.7.2 साथ, आप बहुत उपयोगी case_when फ़ंक्शन का उपयोग कर सकते हैं:

x=read.table(
 text="V1 V2 V3 V4
 1  1  2  3  5
 2  2  4  4  1
 3  1  4  1  1
 4  4  5  1  3
 5  5  5  5  4")
x$V5 = case_when(x$V1==1 & x$V2!=4 ~ 1,
                 x$V2==4 & x$V3!=1 ~ 2,
                 TRUE ~ 0)

dplyr::mutate साथ व्यक्त dplyr::mutate , यह देता है:

x = x %>% mutate(
     V5 = case_when(
         V1==1 & V2!=4 ~ 1,
         V2==4 & V3!=1 ~ 2,
         TRUE ~ 0
     )
)

कृपया ध्यान दें कि NA को विशेष रूप से व्यवहार नहीं किया जाता है, क्योंकि यह भ्रामक हो सकता है। फ़ंक्शन NA तभी लौटेगा जब किसी भी स्थिति का मिलान नहीं किया जाएगा। यदि आप TRUE ~ ... साथ एक लाइन डालते हैं, जैसे मैंने अपने उदाहरण में किया है, तो रिटर्न मान कभी NA नहीं होगा।

इसलिए, आपको NA case_when लिए case_when को case_when से बताना case_when कि यह is.na(x$V1) | is.na(x$V3) ~ NA_integer_ जैसे कथन को जोड़कर कहां है is.na(x$V1) | is.na(x$V3) ~ NA_integer_ is.na(x$V1) | is.na(x$V3) ~ NA_integer_ संकेत: dplyr::coalesce() फ़ंक्शन वास्तव में कभी-कभी यहां उपयोगी हो सकता है!

इसके अलावा, कृपया ध्यान दें कि अकेले NA आमतौर पर काम नहीं करेगा, आपको विशेष NA मान रखना होगा: NA_integer_ , NA_character_ या NA_real_

चार कॉलम वाले एक बड़े डेटाफ़्रेम ("मायफ़ाइल") में मुझे पहले चार स्तंभों के आधार पर एक पांचवें स्तंभ को मान के साथ जोड़ना होगा। हाल ही में मैं dplyr का बहुत बड़ा प्रशंसक बन गया हूं, मुख्यतः बड़े डेटासेट में इसकी गति के कारण। इसलिए मैं सोच रहा था कि क्या मैं म्यूटेट फ़ंक्शन का उपयोग करके अपनी समस्या से निपट सकता हूं।

मेरा डेटाफ़्रेम (वास्तव में इसका एक छोटा संस्करण) इस तरह दिखता है:

  V1 V2 V3 V4
1  1  2  3  5
2  2  4  4  1
3  1  4  1  1
4  4  5  1  3
5  5  5  5  4

पांचवें कॉलम (V5) के मान कुछ सशर्त नियमों पर आधारित हैं:

if (V1==1 & V2!=4){
V5 <- 1
}
else if (V2==4 & V3!=1){
V5 <- 2
}
else {
V5 <- 0
}

अब मैं सभी पंक्तियों पर इन नियमों का उपयोग करने के लिए म्यूट फ़ंक्शन का उपयोग करना चाहता हूं (इसलिए मुझे धीमी लूप का उपयोग करने की आवश्यकता नहीं है)। ऐसा कुछ (और हाँ, मुझे पता है कि यह इस तरह से काम नहीं करता है!):

myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
    else if (V2==4 & V3!=1){V5 = 2}
    else {V5 = 0})

यह परिणाम होना चाहिए:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

यह कैसे करते हैं?


इसे इस्तेमाल करे:

myfile %>% mutate(V5 = (V1 == 1 & V2 != 4) + 2 * (V2 == 4 & V3 != 1))

दे रही है:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

या यह:

myfile %>% mutate(V5 = ifelse(V1 == 1 & V2 != 4, 1, ifelse(V2 == 4 & V3 != 1, 2, 0)))

दे रही है:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

सुझाव है कि आप अपने डेटा फ्रेम के लिए एक बेहतर नाम प्राप्त करें। myfile बनाता है ऐसा लगता है जैसे यह एक फ़ाइल नाम रखता है।

ऊपर इस इनपुट का इस्तेमाल किया:

myfile <- 
structure(list(V1 = c(1L, 2L, 1L, 4L, 5L), V2 = c(2L, 4L, 4L, 
5L, 5L), V3 = c(3L, 4L, 1L, 1L, 5L), V4 = c(5L, 1L, 1L, 3L, 4L
)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))

अद्यतन 1 क्योंकि मूल रूप से पोस्ट की गई dplyr %.% बदल गई है %.% से %>% तो तदनुसार संशोधित उत्तर हैं।

अपडेट 2 dplyr में अब case_when जो दूसरा समाधान प्रदान करता है:

myfile %>% 
       mutate(V5 = case_when(V1 == 1 & V2 != 4 ~ 1, 
                             V2 == 4 & V3 != 1 ~ 2,
                             TRUE ~ 0))

ऐसा लगता है कि mosaic पैकेज से derivedFactor लिए डिज़ाइन किया गया था। इस उदाहरण में, यह कुछ इस तरह दिखाई देगा:

library(mosaic)
myfile <- mutate(myfile, V5 = derivedFactor(
    "1" = (V1==1 & V2!=4),
    "2" = (V2==4 & V3!=1),
    .method = "first",
    .default = 0
    ))

(यदि आप चाहते हैं कि परिणाम कारक के बजाय संख्यात्मक हो, तो derivedFactor को derivedFactor साथ लपेटें)

ध्यान दें कि .default विकल्प .method = "first" के साथ .method = "first" "और" स्थिति सेट करता है - यह दृष्टिकोण derivedFactor लिए मदद फ़ाइल में वर्णित है।







dplyr