我有以下数据框:
df<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2))
对于[x]
列中的每个项A
,我希望自动创建两个新列并命名为"item[x]_weight"
和"item[x]_numbers"
。
对于每个列,我想在初始数据框中分配A_weight
和A_numbers
列的值。
与item[x]
列中A
的每个出现位置相邻。
最终数据框应如下所示:
df_final<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2), item1_weight=c(4.2,4.2, NA, NA, NA),
item1_numbers=c(1,2, NA, NA, NA), item2_weight=c(NA, NA, 6.1, 6.4, NA),
item2_numbers=c(NA, NA, 8, 5, NA), item3_weight=c(NA, NA, NA, NA, 8.5),
item3_numbers=c(NA, NA, NA, NA, 2))
我尝试过使用reshape包和匹配函数的几种方法,但我觉得我似乎没有取得任何进展(即我得不到合适的结果......)。鉴于我在原始数据集中有一个非常大的“项目”列表,这不是手动完成的过程。任何帮助都会非常感激,因为我对R很新,我可以使用一些指导。谢谢
答案 0 :(得分:1)
使用reshape2附加一列行号,将其融合为长格式,然后使用dcast
转换为与原始数据帧合并的宽格式并删除行号。最后修改名称:
library(reshape2)
df.row <- cbind(row = 1:nrow(df), df)
m <- melt(df.row, id = 1:3)
wide <- merge(df.row, dcast(m, row ~ A + variable))[-1]
setNames(wide, sub("_A_", "_", names(wide)))
最后一行给出:
site A A_weight A_numbers item1_weight item1_numbers item2_weight
1 A item1 4.2 1 4.2 1 NA
2 A item1 4.2 2 4.2 2 NA
3 B item2 6.1 8 NA NA 6.1
4 C item2 6.4 5 NA NA 6.4
5 B item3 8.5 2 NA NA NA
item2_numbers item3_weight item3_numbers
1 NA NA NA
2 NA NA NA
3 8 NA NA
4 5 NA NA
5 NA 8.5 2
答案 1 :(得分:0)
这是一种方法,但我确信有更好的方法:
dat <- lapply(unique(df$A), function(x) {
out <- df$A == x
dat <- matrix(rep(NA,2*nrow(df)), nrow = nrow(df))
dat[out, 1] <- df[out, 3]
dat[out, 2] <- df[out, 4]
colnames(dat) <- paste(x, c("weight", "numbers"), sep="_")
dat
})
data.frame(df, do.call(cbind, dat))
## > data.frame(df, do.call(cbind, dat))
## site A A_weight A_numbers item1_weight item1_numbers item2_weight item2_numbers item3_weight item3_numbers
## 1 A item1 4.2 1 4.2 1 NA NA NA NA
## 2 A item1 4.2 2 4.2 2 NA NA NA NA
## 3 B item2 6.1 8 NA NA 6.1 8 NA NA
## 4 C item2 6.4 5 NA NA 6.4 5 NA NA
## 5 B item3 8.5 2 NA NA NA NA 8.5 2
答案 2 :(得分:0)
基础重塑应该能够做到。如果你想要A_weight和A_number变量你可以手动添加它们,或者在reshape()调用中可能有一个选项来保持它们(我只是在看了一下文档时没看到它)。
> df<-data.frame(site=c("A", "A", "B", "C", "B"), A=c("item1", "item1", "item2", "item2", "item3"),
+ A_weight=c(4.2,4.2,6.1,6.4,8.5), A_numbers=c(1,2,8,5,2))
>
> (df_final <- reshape(df,idvar=c("site","A_numbers","A_weight"),timevar="A",direction="wide",v.names=c("A_numbers","A_weight")))
site A_numbers.item1 A_weight.item1 A_numbers.item2 A_weight.item2 A_numbers.item3 A_weight.item3
1 A 1 4.2 NA NA NA NA
2 A 2 4.2 NA NA NA NA
3 B NA NA 8 6.1 NA NA
4 C NA NA 5 6.4 NA NA
5 B NA NA NA NA 2 8.5