在tidyr中理解聚集功能的问题

时间:2016-04-13 16:38:33

标签: r tidyr

我在理解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

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]

无论你使用哪种,你都会得到同样的东西,所以选择你最喜欢的。