从 R 中具有相同 ID 的行创建新变量(在新列中但不创建新列)
Create new variable (in new columns but not create new column) from rows with same ID in R
我想将 may 数据框(左)更改为(右)。
我使用了 reshape 包,但是它会创建新的列而不是我想要的创建
如果有人能帮我解决我的问题,非常感谢!
您需要先创建另一个变量 v1
或 v2
(对于上面给出的示例数据)。
我们使用 ave
和 seq_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
您可以使用 rbind
或 rbind.na
我想将 may 数据框(左)更改为(右)。 我使用了 reshape 包,但是它会创建新的列而不是我想要的创建
如果有人能帮我解决我的问题,非常感谢!
您需要先创建另一个变量 v1
或 v2
(对于上面给出的示例数据)。
我们使用 ave
和 seq_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
您可以使用 rbind
或 rbind.na