通过R中的某个行名将行数据转换为列

时间:2014-10-03 23:13:11

标签: r merge transformation transpose

嘿所以我对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。

谁能告诉我如何进行这种转变?非常感谢!

2 个答案:

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

基地R:reshape

因其语法而臭名昭着......并且可能不建议使用2M行......

reshape(within(DF, {
  id <- cummax(ave(V1, V1, FUN = seq_along))
}), direction = "wide", idvar = "id", timevar = "V1")

基地R:xtabs

更容易记住语法,但灵活性较差。另外,返回matrix,因此如果您想获得as.data.frame.matrix,则需要使用data.frame。用“0”填充缺失值,这可能是不可取的。

xtabs(V2 ~ id + V1, within(DF, {
  id <- cummax(ave(V1, V1, FUN = seq_along))
}))

“data.table”

快速。 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)