【发布时间】:2017-06-22 19:53:52
【问题描述】:
尽管有 R 的约定,但对我来说,数据收集和输入最容易在垂直列中完成。因此,我有一个关于使用 tidyverse 库中的 gather() 函数有效转换为水平行的问题。我发现自己一遍又一遍地使用 collect() 似乎效率低下。有没有更有效的方法?现有的向量可以作为关键吗?这是一个例子:
假设我们有以下关于幼鸟的健康指标。
bird day_1_mass day_2_mass day_1_heart_rate day_3_heart_rate
1 1 5 6 60 55
2 2 6 8 62 57
3 3 3 3 45 45
使用收集功能,我可以将海量数据重新组织成行。
horizontal.data <- gather(vertical.data,
key = age,
value = mass,
day_1_mass:day_2_mass,
factor_key=TRUE)
给我们
bird day_1_heart_rate day_3_heart_rate age mass
1 1 60 55 day_1_mass 5
2 2 62 57 day_1_mass 6
3 3 45 45 day_1_mass 3
4 1 60 55 day_2_mass 6
5 2 62 57 day_2_mass 8
6 3 45 45 day_2_mass 3
并再次使用相同的函数来类似地重组心率数据。
horizontal.data.2 <- gather(horizontal.data,
key = age2,
value = heart_rate,
day_1_heart_rate:day_3_heart_rate,
factor_key=TRUE)
产生一个新的数据帧
bird age mass age2 heart_rate
1 1 day_1_mass 5 day_1_heart_rate 60
2 2 day_1_mass 6 day_1_heart_rate 62
3 3 day_1_mass 3 day_1_heart_rate 45
4 1 day_2_mass 6 day_1_heart_rate 60
5 2 day_2_mass 8 day_1_heart_rate 62
6 3 day_2_mass 3 day_1_heart_rate 45
7 1 day_1_mass 5 day_3_heart_rate 55
8 2 day_1_mass 6 day_3_heart_rate 57
9 3 day_1_mass 3 day_3_heart_rate 45
10 1 day_2_mass 6 day_3_heart_rate 55
11 2 day_2_mass 8 day_3_heart_rate 57
12 3 day_2_mass 3 day_3_heart_rate 45
所以它采取了两个步骤,但它奏效了。问题是 1) 有没有办法一步完成? 2) 是否可以用一个键(“年龄”向量)来完成,然后我可以简单地将其替换为数字数据?
【问题讨论】:
-
你为什么不直接使用管道函数来结合这两个步骤。我认为没有办法将您想要的操作包含在一个
gather()函数中 >>gather(vertical.data, key = age, value = mass, day_1_mass:day_2_mass, factor_key=TRUE) %>% gather(key = age2, value = heart_rate, day_1_heart_rate:day_3_heart_rate, factor_key=TRUE)