我有一个如下所示的数据框:
Code ID X1 X2
1 1000 2 1.6 250.6
2 1000 3 0.15 340.9
3 1001 2 0.53 441.7
4 1001 3 1.8 499.0
5 1002 2 4.4 516.6
6 1003 3 4.9 616.6
我想要做的是创建一个新的数据框,其中包含唯一的代码和每个唯一的ID作为列(有两个唯一的ID:2和3),以及相应的X1和X2值,因此结果应该是看起来像这样:
Code ID2X1 ID2X2 ID3X1 ID3X2
1 1000 1.6 250.6 0.15 340.9
2 1001 0.53 441.7 1.8 499.0
5 1002 4.4 516.6 NA NA
6 1003 NA NA 4.9 616.6
我使用“唯一”函数来提取唯一代码,因此我有第一列,但无法想到提取数据的有效方法。请注意,某些代码没有ID2或ID3的值。
答案 0 :(得分:1)
使用dplyr
和tidyr
library(dplyr)
library(tidyr)
mydf%>%
gather(Var, Val, X1:X2) %>%
mutate(IDVar=paste0("ID", ID, Var)) %>%
select(-ID, -Var) %>%
spread(IDVar, Val)
# Code ID2X1 ID2X2 ID3X1 ID3X2
#1 1000 1.60 250.6 0.15 340.9
#2 1001 0.53 441.7 1.80 499.0
#3 1002 4.40 516.6 NA NA
#4 1003 NA NA 4.90 616.6
答案 1 :(得分:0)
这是一个基本的reshape
问题,从“长”变为“宽”。
尝试以下方法(假设您的data.frame
被称为“mydf”):
reshape(mydf, idvar="Code", timevar="ID", direction = "wide")
# Code X1.2 X2.2 X1.3 X2.3
# 1 1000 1.60 250.6 0.15 340.9
# 3 1001 0.53 441.7 1.80 499.0
# 5 1002 4.40 516.6 NA NA
# 6 1003 NA NA 4.90 616.6
答案 2 :(得分:0)
这是使用reshape2
包的另一个选项:
dat = read.table(text=" Code ID X1 X2
1 1000 2 1.6 250.6
2 1000 3 0.15 340.9
3 1001 2 0.53 441.7
4 1001 3 1.8 499.0
5 1002 2 4.4 516.6
6 1003 3 4.9 616.6",header=TRUE)
library(reshape2)
# Melt to long format.
dat.m = melt(dat, id.var=c("Code","ID"))
# Combine "ID" and "variable" into a single column
dat.m$IDvar = paste0("ID", dat.m$ID, dat.m$variable)
# Remove uneeded columns
dat.m = dat.m[ , c("Code","IDvar", "value")]
# Cast to wide format
dat.w = dcast(dat.m, Code ~ IDvar, value.var="value")
dat.w
Code ID2X1 ID2X2 ID3X1 ID3X2
1 1000 1.60 250.6 0.15 340.9
2 1001 0.53 441.7 1.80 499.0
3 1002 4.40 516.6 NA NA
4 1003 NA NA 4.90 616.6