我在理解gather
的{{1}}功能时遇到了一些问题。我有以下数据框:
tidyr
我想将列tidyv1 <- data.frame(name=c("Jake","Alice","Tim","Denise"),
age=c(34,55,76,19),
brown=c(0,0,1,0),
blue=c(0,1,0,0),
other=c(1,0,0,1),
height=c(6.1,5.9,5.7,5.1))
作为一个变量。这是我的代码:
brown:other
结果如下:
tidyc1 <- gather(tidyv1, key=eye_color, value=val, brown:other, factor_key=TRUE)
我期待的结果是:
name age height eye_color val
1 Jake 34 6.1 brown 0
2 Alice 55 5.9 brown 0
3 Tim 76 5.7 brown 1
4 Denise 19 5.1 brown 0
5 Jake 34 6.1 blue 0
6 Alice 55 5.9 blue 1
7 Tim 76 5.7 blue 0
8 Denise 19 5.1 blue 0
9 Jake 34 6.1 other 1
10 Alice 55 5.9 other 0
11 Tim 76 5.7 other 0
12 Denise 19 5.1 other 1
我知道可以通过额外的代码轻松修复,但我想了解是否有直接的方法。例如:
name age eye_color height
1 Jake 34 other 6.1
2 Alice 55 blue 5.9
3 Tim 76 brown 5.7
4 Denise 19 other 5.1
答案 0 :(得分:3)
gather
通过将列名称熔化为一行并将值转换为另一行来重新排列数据,但不会丢弃数据。在tidyv1
中,您有数据告诉人们不具有某些眼睛颜色,以及他们所做的那些,所有这些都由gather
保留。如果您使用的是NA
,则可以使用na.rm = TRUE
,但最终还是会有一个额外的val
列。
因此,gather
本身并不能直接做你想做的事。你可以用事后用
tidyc1[tidyc1$val == 1, -5]
...或与dplyr
内联:
library(dplyr)
tidyv1 %>% gather(key=eye_color, value=val, brown:other, factor_key=TRUE) %>%
filter(val == 1) %>% select(-val)
...或者只使用dplyr
执行整个操作:
tidyv1 %>% rowwise() %>%
mutate(eye_color = c('brown', 'blue', 'other')[which(c(brown, blue, other) == 1)]) %>%
select(-brown:-other)
...或与基地:
tidyv1$eye_color <- apply(tidyv1[,c('brown', 'blue', 'other')], 1,
function(x){c('brown', 'blue', 'other')[x == 1]})
tidyv1 <- tidyv1[,-3:-5]
无论你使用哪种,你都会得到同样的东西,所以选择你最喜欢的。