这是我已经工作了一段时间的事情,只是制作单独的数据帧并进行 full_join,但我认为有一种更简单的方法。
总的来说,我想根据长格式数据帧的类型计算从时间 1 到时间 2 的单个 ID 值之间的差异。这是我认为我可以做到的方法之一,但如果其他人有其他技术或想法,我也想听听。
但是,我也想知道如何解决这个转置问题,因为我很好奇。
这是我的问题。
我有一个长格式的数据框,其中包含两个不同时间段的 5 种不同度量。我想将此数据帧从长格式转换为宽格式,这样 DF 就不会像这样(注意,并非所有类型都包含在内 - 为了长度起见,只做了 2 个):
(示例 df1)
ID Time Value Type
1 1 7 Type1
1 2 8 Type1
2 1 9 Type1
2 2 10 Type1
1 1 13 Type2
1 2 15 Type2
2 1 17 Type2
2 2 19 Type2
我希望它看起来更像这样:
(示例 df 2)
ID Type1.1 Type1.2 Type2.1 Type2.2
1 7 8 13 15
2 9 10 17 19
我使用:
library(dplyr)
library(tidyr)
df.new <- df %>%
spread(Type, Measurement.Value)
并从正确的示例 df 1 中获取此内容:
(示例 df 3)
ID Time Type1 Type2
1 1 7 13
1 2 8 15
2 1 9 17
2 2 10 19
但现在我想分散每种类型的时间。当我在示例 df3 上执行类似操作时:
newer.df <- df.new %>%
spread(Time, Type1)
要做到这一点:
ID Type1.1 Type1.2
1 7 NA
1 NA 8
2 9 NA
2 NA 10
所以,它为每一行生成一个 NA —— 有没有办法可以通过 ID 将行折叠到彼此上?我想我错过了一些东西。
请记住,在我的示例代码中,我只使用了 2 种类型,但实际上我有 5 种类型 - 只是想提供简化的代码。
最佳答案
我们可以使用reshape2
包中的dcast()
。
library(reshape2)
dcast(df, ID ~ Type + Time, value.var = "Value")
# ID Type1_1 Type1_2 Type2_1 Type2_2
#1 1 7 8 13 15
#2 2 9 10 17 19
关于R:从长转为宽并聚合具有匹配 ID 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35902491/