2016-08-27 11 views
5

İşte benim verilerin bir enstantane:R, mutasyon ve "sütununda için desteklenmeyen tip 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") 

ben twinfam (ailede ikiz) ve SAMESEX kullanmaya çalışıyorum (ilk iki doğan çocukların aynı cinsiyetten) ikili değişkenler 4 olası değerleri alır dördüncü bir değişken oluşturmak için:

  • 1 ise SAMESEX == 0 & twinfam == 0

  • 2 SAMESEX == 1halindetwinfam == 0

  • 3 ise SAMESEX == 0 & twinfam == 1

  • 4 ise SAMESEX == 1 & twinfam == 1

biraz uğraşırken sonra kullanarak çalıştı:

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}) 

ama hata alıyorum:

ve bu hatayı gideremiyor gibi görünüyor. Bu hatayı almamın ve nasıl çözüleceğine dair herhangi bir tavsiye memnuniyetle karşılanacaktır!

cevap

4

Bir anahtar/değer veri kümesini oluşturmak ve dplyr kullanmak istiyorsanız bir 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

, aşağıdaki deneyebilirsiniz yapmak daha iyidir. Veri çerçeveniz burada mydf olarak adlandırılmıştır. case_when() kullanabilir ve both'u oluşturabilirsiniz. Yanılmıyorsam, işlevi henüz mutate()'da kullanamazsınız. Yani, bir vektör oluşturmak ve sonunda cbind() kullanmak istiyorsunuz. akrun yorumladığı gibi

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) 

, şimdi mutate() içinde case_when() kullanabilirsiniz.

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 Uzun zamandır konuşma yok. Bilgi için teşekkürler. Case_when() 'hakkındaki son güncellemem, Haziran ayında R blogger'larında Hadley'nin yazdığı yazıydı. Şimdi fonksiyonun mutasyon() 'da çalıştığını biliyorum. Teşekkür ederim. :) – jazzurro

+0

Tekrar görüştüğümüze sevindim. Umarım iyisindir. – akrun

+0

@akrun İyi iş çıkarıyorum. İşimden dolayı kendime yaptığım gibi burada kendimi işlemek için zamanım yok. Ama ben kendim için zamanım olduğu için Eylül ayında daha çok olacağım. Bu arada, mydf%>% mutasyon (her ikisi = case_when (. $ SAMESEX == 0 &. $ Twinfam == 0 ~ 1, ...) 'çalışır. Fakat mutasyon (mydf, both = case_when (. $ SAMESEX == 0 &. $ Twinfam == 0 ~ 1, ...) 'çalışmıyor. Neden böyle olduğunu biliyor musunuz? – jazzurro

İlgili konular