2016-08-27 16 views
5

यहाँ मेरी डेटा का एक स्नैपशॉट है:आर, मे बदलें और "कॉलम के लिए असमर्थित प्रकार NILSXP"

structure(list(CPUBID = c(1000001L, 1000002L, 1000003L, 10001L, 
1000201L, 1000203L, 10003L, 1000801L, 1000802L, 1000803L, 1001L, 
1001101L, 1001102L, 1001601L, 1002401L, 1002402L, 1002403L, 1002601L, 
1002602L, 1002604L), MPUBID = c(10000L, 10000L, 10000L, 100L, 
10002L, 10002L, 100L, 10008L, 10008L, 10008L, 10L, 10011L, 10011L, 
10016L, 10024L, 10024L, 10024L, 10026L, 10026L, 10026L), CYRB = c(1982L, 
1984L, 1988L, 1985L, 1986L, 1992L, 1993L, 1984L, 1986L, 1988L, 
1983L, 1987L, 1992L, 1977L, 1981L, 1984L, 1998L, 1980L, 1981L, 
1984L), twinfam = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), SAMESEX = c(1L, 1L, 1L, 
1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L), top25 = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 
0, 0, 0, 0), top5 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0), quantity = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1)), .Names = c("CPUBID", "MPUBID", 
"CYRB", "twinfam", "SAMESEX", "top25", "top5", "quantity"), row.names = c(NA, 
20L), class = "data.frame") 

मैं twinfam (परिवार में जुड़वां) और SAMESEX उपयोग करने के लिए कोशिश कर रहा हूँ (पहले दो पैदा हुए बच्चों एक ही लिंग) बाइनरी चर 4 संभावित मान पर एक चौथे चर लेता है बनाने के लिए:

  • 1 यदि SAMESEX == 0 & twinfam == 0

  • 2 यदि SAMESEX == 1 & twinfam == 0

  • 3 अगर SAMESEX == 0 & twinfam == 1

  • 4 अगर SAMESEX == 1 & twinfam == 1

थोड़ा चारों ओर खेलने के बाद मैं उपयोग करने की कोशिश:

df <- df %>% mutate(both = for (i in 1:nrow(PIATmathreg6)) { 
           if(twinfam[i] == 0 & SAMESEX[i] == 0) both = 1 
           else if(twinfam[i] == 0 & SAMESEX[i] == 1) both = 2 
           else if(twinfam[i] == 1 & SAMESEX[i] == 0) both = 3 
           else both = 4}) 

लेकिन मैं त्रुटि मिलती है:

Error: Unsupported type NILSXP for column "both" 

और इस त्रुटि को हल करने के लिए प्रतीत नहीं कर सकते हैं। मुझे यह त्रुटि क्यों मिलती है, और इसे कैसे हल किया जा सकता है, इस पर कोई सलाह दी जाएगी!

उत्तर

4

यह एक कुंजी/मान डाटासेट बना सकते हैं और एक left_join

library(dplyr) 
df2 <- data.frame(SAMESEX = c(0, 1, 0, 1), twinfam = c(0, 0, 1, 1), both = 1:4) 
left_join(df, df2, by = c("SAMESEX", "twinfam")) 
# CPUBID MPUBID CYRB twinfam SAMESEX top25 top5 quantity both 
#1 1000001 10000 1982  0  1  0 0  1 2 
#2 1000002 10000 1984  0  1  0 0  1 2 
#3 1000003 10000 1988  0  1  0 0  1 2 
#4 10001 100 1985  0  1  0 0  1 2 
#5 1000201 10002 1986  0  0  0 0  1 1 
#6 1000203 10002 1992  0  0  1 0  1 1 
#7 10003 100 1993  0  1  0 0  1 2 
#8 1000801 10008 1984  0  0  0 0  1 1 
#9 1000802 10008 1986  0  0  0 0  1 1 
#10 1000803 10008 1988  0  0  0 0  1 1 
#11 1001  10 1983  0  1  1 0  0 2 
#12 1001101 10011 1987  0  0  0 0  0 1 
#13 1001102 10011 1992  0  0  0 0  0 1 
#14 1001601 10016 1977  0  1  0 0  1 2 
#15 1002401 10024 1981  0  0  1 0  1 1 
#16 1002402 10024 1984  0  0  0 0  1 1 
#17 1002403 10024 1998  0  0  0 0  1 1 
#18 1002601 10026 1980  0  0  0 0  1 1 
#19 1002602 10026 1981  0  0  0 0  1 1 
#20 1002604 10026 1984  0  0  0 0  1 1 
3

आप dplyr का उपयोग करना चाहते हैं, तो आप निम्न को आज़मा सकते करने के लिए बेहतर है। आपके डेटा फ्रेम को mydf कहा जाता है। आप case_when() का उपयोग कर सकते हैं और both बना सकते हैं। अगर मुझे गलत नहीं लगता है, तो आप अभी तक mutate() में फ़ंक्शन का उपयोग नहीं कर सकते हैं। तो, आप एक वेक्टर बनाना चाहते हैं और अंत में cbind() का उपयोग करना चाहते हैं।

both <- case_when(mydf$SAMESEX == 0 & mydf$twinfam == 0 ~ 1, 
        mydf$SAMESEX == 1 & mydf$twinfam == 0 ~ 2, 
        mydf$SAMESEX == 0 & mydf$twinfam == 1 ~ 3, 
        mydf$SAMESEX == 1 & mydf$twinfam == 1 ~ 4) 

cbind(mydf, both) 

akrun टिप्पणी की के रूप में, अब आप case_when()mutate() में उपयोग कर सकते हैं।

mydf %>% 
mutate(both = case_when(.$SAMESEX == 0 & .$twinfam == 0 ~ 1, 
         .$SAMESEX == 1 & .$twinfam == 0 ~ 2, 
         .$SAMESEX == 0 & .$twinfam == 1 ~ 3, 
         .$SAMESEX == 1 & .$twinfam == 1 ~ 4)) 

# CPUBID MPUBID CYRB twinfam SAMESEX top25 top5 quantity both 
#1 1000001 10000 1982  0  1  0 0  1 2 
#2 1000002 10000 1984  0  1  0 0  1 2 
#3 1000003 10000 1988  0  1  0 0  1 2 
#4 10001 100 1985  0  1  0 0  1 2 
#5 1000201 10002 1986  0  0  0 0  1 1 
#6 1000203 10002 1992  0  0  1 0  1 1 
#7 10003 100 1993  0  1  0 0  1 2 
#8 1000801 10008 1984  0  0  0 0  1 1 
#9 1000802 10008 1986  0  0  0 0  1 1 
#10 1000803 10008 1988  0  0  0 0  1 1 
#11 1001  10 1983  0  1  1 0  0 2 
#12 1001101 10011 1987  0  0  0 0  0 1 
#13 1001102 10011 1992  0  0  0 0  0 1 
#14 1001601 10016 1977  0  1  0 0  1 2 
#15 1002401 10024 1981  0  0  1 0  1 1 
#16 1002402 10024 1984  0  0  0 0  1 1 
#17 1002403 10024 1998  0  0  0 0  1 1 
#18 1002601 10026 1980  0  0  0 0  1 1 
#19 1002602 10026 1981  0  0  0 0  1 1 
#20 1002604 10026 1984  0  0  0 0  1 1 
+1

@akrun लंबे समय तक कोई बात नहीं। जानकारी के लिए धन्यवाद। जून में वापस आर ब्लॉगर्स पर हैडली की पोस्ट 'case_when()' के बारे में मेरा आखिरी अपडेट था। अब मुझे पता है कि समारोह 'mutate() 'में काम कर रहा है। धन्यवाद। :) – jazzurro

+0

आपको फिर से देखने के लिए अच्छा लगा। आशा है आप अच्छे होंगे। – akrun

+0

@akrun मैं अच्छा कर रहा हूं। मेरे पास अभी खुद को प्रतिबद्ध करने का समय नहीं है क्योंकि मैं अपने काम के कारण होता था। लेकिन सितंबर में मैं यहां और अधिक रहूंगा क्योंकि मेरे पास समय है। वैसे, 'mydf%>% mutate (दोनों = case_when (। $ SAMESEX == 0 और $ twinfam == 0 ~ 1, ...)' काम करता है। '' Mutate (mydf, both = case_when (। $ SAMESEX == 0 और $ twinfam == 0 ~ 1, ...) 'काम नहीं करता है। क्या आपको पता है कि यह मामला क्यों है? – jazzurro

संबंधित मुद्दे