从 R 中具有相同 ID 的行创建新变量(在新列中但不创建新列)

Create new variable (in new columns but not create new column) from rows with same ID in R

我想将 may 数据框(左)更改为(右)。 我使用了 reshape 包,但是它会创建新的列而不是我想要的创建

如果有人能帮我解决我的问题,非常感谢!

您需要先创建另一个变量 v1v2(对于上面给出的示例数据)。

我们使用 aveseq_along 创建一个 运行 长度的类型 ID 列,'idx'。该变量将从 1 到每组 'IDBILL' 的观察总数。我们使用paste0来添加后缀"v"

(DF <- transform(DF, 
                 idx = ave(IDPRODUCT,
                           IDBILL, # grouping variable
                           FUN = function(x) paste0("v", seq_along(x))
       )))
#  IDBILL IDPRODUCT idx
#1    111    ABC123  v1
#2    111    ABC124  v2
#3    112    BCH134  v1
#4    113    ABC123  v1
#5    113    GDF345  v2

现在使用 reshape2 中的 dcast 展开 'idx' 列并填写 'IDPRODUCT'.

的值
library(reshape2)
(dcast(DF, IDBILL ~ idx, value.var = 'IDPRODUCT'))
#  IDBILL     v1     v2
#1    111 ABC123 ABC124
#2    112 BCH134   <NA>
#3    113 ABC123 GDF345

如果没有额外的软件包,您可以使用 reshape 而不是 dcast

reshape(DF, idvar = "IDBILL", timevar = "idx", direction = "wide")

如果你喜欢data.table,你可以试试

library(data.table)
setDT(DF)[, idx := paste0("v", rleid(IDPRODUCT)), by = IDBILL]
dcast(DF, IDBILL ~ idx, value.var = 'IDPRODUCT')

要最终完成邪恶的三位一体 - 尝试 tidyverse

library(tidyverse)
DF %>% 
  group_by(IDBILL) %>% 
  mutate(idx = paste0("v", row_number())) %>% 
  spread(idx, IDPRODUCT) %>% 
  ungroup()

数据

DF <- structure(list(IDBILL = c(111, 111, 112, 113, 113), IDPRODUCT = c("ABC123", 
"ABC124", "BCH134", "ABC123", "GDF345")), .Names = c("IDBILL", 
"IDPRODUCT"), row.names = c(NA, -5L), class = "data.frame")

希望您也考虑这个解决方案。

数据生成

dt<-data.frame("id"=sample(3,5,replace = TRUE),value=sample(5))
m<-merge(dt, dt) 

然后

IDs<-unique(m[,1])   

i<-1
res<-NULL
while(i<=length(IDs)){

   res<-rbind(res, c(IDs[i],m[m[,1]==IDs[i],2]))
   i<-i+1
}
res

您可以使用 rbindrbind.na