r语言 - 如何读取列的内容,将这些值分配给新列,并用其他列的值填充它们



我有以下数据框架:

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))

对于列A中的每个项目[x],我希望自动创建两个新列,命名为"item[x]_weight""item[x]_numbers"。对于这些列中的每一列,我想分配初始数据帧中A_weightA_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))

我尝试了几种使用重塑包和匹配函数的方法,但我觉得我似乎没有取得任何进展(即我没有得到体面的结果…)。考虑到我在原始数据集中有一个相当大的"项目"列表,这不是一个手动完成的过程。任何帮助将不胜感激,因为我是相当新的R,我可以使用一些指导。谢谢你

使用shape2添加行号列,将其融化为长格式,然后使用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

这是一种方法,但我相信还有更好的方法:

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

基础重塑应该能够做到这一点。如果您想要A_weight和A_number变量,您可以手动添加它们,或者可以在重塑()调用中保留它们(我只是在浏览文档时没有看到它)。

> 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

相关内容

  • 没有找到相关文章

最新更新