嘿所以我对R很新,只熟悉一些函数。我有大约2,000,000行的行数据。
原始数据是这样的,一项有四种关税(AHS,BND,MFN,PRF)。有些数据有PRF,有些数据没有。目标是根据关税类型将每个项目的关税转换为一个列。
AHS 3.00
BND 3.80
MFN 4.00
PRF 2.00
AHS 4.00
BND 3.80
MFN 4.00
如何将原始数据转换为如下:
AHS BND MFN PRF
3.00 3.80 4.00 2.00
4.00 3.80 4.00 NA
我试过rbind,因为那些没有PRF的人,R会将AHS分配到PRF。
谁能告诉我如何进行这种转变?非常感谢!
答案 0 :(得分:3)
您可以在基础R中使用ave
或在包中使用类似方法来创建“id”变量。由于缺少某些“PRF”值,您可能还需要在ID创建阶段使用cummax
。
以下是一些替代方案,全部使用@ G.Grothendieck的样本数据。我的投票将采用“data.table”方法。
DF <- data.frame(
V1 = c("AHS", "BND", "MFN", "PRF", "AHS", "BND", "MFN"),
V2 = c(3, 3.8, 4, 2, 4, 3.8, 4),
stringsAsFactors = FALSE)
reshape
因其语法而臭名昭着......并且可能不建议使用2M行......
reshape(within(DF, {
id <- cummax(ave(V1, V1, FUN = seq_along))
}), direction = "wide", idvar = "id", timevar = "V1")
xtabs
更容易记住语法,但灵活性较差。另外,返回matrix
,因此如果您想获得as.data.frame.matrix
,则需要使用data.frame
。用“0”填充缺失值,这可能是不可取的。
xtabs(V2 ~ id + V1, within(DF, {
id <- cummax(ave(V1, V1, FUN = seq_along))
}))
快速。 dcast.data.table
以下行为的可预测行为,由dcast
从“reshape2”长期确定。
library(data.table)
dcast.data.table(
as.data.table(DF)[, id := sequence(.N), by = V1][, id := cummax(id)],
id ~ V1, value.var = "V2")
# id AHS BND MFN PRF
# 1: 1 3 3.8 4 2
# 2: 2 4 3.8 4 NA
答案 1 :(得分:2)
创建一个grp
变量,第一组为1,第二组为2,等等。然后使用tapply
grp <- cumsum(DF$V1 == "AHS")
tapply(DF$V2, list(grp, DF$V1), sum)
,并提供:
AHS BND MFN PRF
1 3 3.8 4 2
2 4 3.8 4 NA
我们用它作为数据:
DF <- data.frame(V1 = c("AHS", "BND", "MFN", "PRF", "AHS", "BND", "MFN"),
V2 = c(3, 3.8, 4, 2, 4, 3.8, 4), stringsAsFactors = FALSE)