我正在尝试将几个用户填充的变量分成多个列。我试图使用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的新手,并且在数据库的这个方面遇到了很多麻烦。我有太多的选择来分别陈述香蕉和苹果,我真的不确定如何做到这一点。
答案 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$Input1
或df$Input2
为“Banana”,则第一行逐行检查;如果是这样,它会将"Banana"
放在Banana
列中,否则会将NA
放入。{/ p>