将用户报告的变量传播到多个列

时间:2017-10-01 04:23:28

标签: r

我正在尝试将几个用户填充的变量分成多个列。我试图使用spread函数,但我遇到了一些问题。例如,数据库如下所示:

SubjID         Input1        Input2
1              Banana        NA
2              Apple         NA
3              NA            Banana
4              Apple         Banana

我试图让它看起来像这样:

SubjID         Input1        Input2    Banana   Apple
1              Banana        NA        Banana   NA
2              Apple         NA        NA       Apple
3              NA            Banana    Banana   Na
4              Apple         Banana    Banana   Apple

我可以使用tidyr中的spread函数来分隔输入1,但问题是输入2.我能够传播它,但我不能将值放入先前创建的Banana列中,它将改为创建两个香蕉列,我无法弄清楚如何正确合并。有没有办法让它正确排序到列?我是R的新手,并且在数据库的这个方面遇到了很多麻烦。我有太多的选择来分别陈述香蕉和苹果,我真的不确定如何做到这一点。

2 个答案:

答案 0 :(得分:0)

在执行gather

之前,我们可能需要先spread
library(dplyr)
library(tidyr)
df1 %>% 
  gather(key, val, -SubjID, na.rm = TRUE) %>% 
  mutate(key1 = val) %>% 
  select(-key) %>% spread(key1, val) %>%
  left_join(df1, ., by = 'SubjID')
#  SubjID Input1 Input2 Apple Banana
#1      1 Banana   <NA>  <NA> Banana
#2      2  Apple   <NA> Apple   <NA>
#3      3   <NA> Banana  <NA> Banana
#4      4  Apple Banana Apple Banana

数据

df1 <- structure(list(SubjID = 1:4, Input1 = c("Banana", "Apple", NA, 
"Apple"), Input2 = c(NA, NA, "Banana", "Banana")), .Names = c("SubjID", 
 "Input1", "Input2"), class = "data.frame", row.names = c(NA, 
-4L))

答案 1 :(得分:0)

试试这个:假设您的data.frame被称为dat

dat$Banana <- ifelse(dat$Input1 == "Banana" | dat$Input2 == "Banana", "Banana", NA)
dat$Apple <- ifelse(dat$Input1 == "Apple" | dat$Input2 == "Apple", "Apple", NA)

例如,如果df$Input1df$Input2为“Banana”,则第一行逐行检查;如果是这样,它会将"Banana"放在Banana列中,否则会将NA放入。{/ p>