我有以下数据框:
df<-structure(list(totprivland = c(175L, 50L, 100L, 14L, 4L, 240L,
10L, 20L, 20L, 58L), ncushr8d1 = c(0L, 0L, 0L, 0L, 0L, 30L, 5L,
0L, 0L, 50L), ncu_CENREG1 = structure(c(4L, 4L, 4L, 4L, 1L, 3L,
3L, 3L, 4L, 4L), .Label = c("Northeast", "Midwest", "South",
"West"), class = "factor"), ncushr8d2 = c(75L, 50L, 100L, 14L,
2L, 30L, 5L, 20L, 20L, 8L), ncu_CENREG2 = structure(c(4L, 4L,
4L, 4L, 1L, 2L, 1L, 4L, 3L, 4L), .Label = c("Northeast", "Midwest",
"South", "West"), class = "factor"), ncushr8d3 = c(100L, NA,
NA, NA, 2L, 180L, 0L, NA, NA, NA), ncu_CENREG3 = structure(c(4L,
NA, NA, NA, 1L, 1L, 3L, NA, NA, NA), .Label = c("Northeast",
"Midwest", "South", "West"), class = "factor"), ncushr8d4 = c(NA,
NA, NA, NA, 0L, NA, NA, NA, NA, NA), ncu_CENREG4 = structure(c(NA,
NA, NA, NA, 1L, NA, NA, NA, NA, NA), .Label = c("Northeast",
"Midwest", "South", "West"), class = "factor")), .Names = c("totprivland",
"ncushr8d1", "ncu_CENREG1", "ncushr8d2", "ncu_CENREG2", "ncushr8d3",
"ncu_CENREG3", "ncushr8d4", "ncu_CENREG4"), row.names = c(27404L,
27525L, 27576L, 27822L, 28099L, 28238L, 28306L, 28312L, 28348L,
28379L), class = "data.frame")
=======
以下基本想法是dput
:
Total VariableA LocationA VariableB LocationB
30 20 East 10 East
20 20 South NA West
115 15 East 100 South
100 50 West 50 West
35 10 East 25 South
总数(或dput示例中的totprivland)是变量之和(ncushr8d1,ncushr8d2,ncushr8d3和ncushr8d4),每个变量都有一个相应的因子位置变量(ncu_CENREG1等)。在同一模式中有6个额外的变量和位置。对于多个数值变量,位置变量通常是相同的值(例如,多个'东'位置值,例如示例的第一行)。
我希望通过公共位置因子得到每行的值的总和,为每个位置的总和创建一个新列。它看起来像这样,能够忽略NA值:
Total VariableA LocationA VariableB LocationB TotalWest TotalEast TotalSouth
30 20 East 10 East 0 30 0
20 20 South NA NA 0 0 20
115 15 East 100 South 0 15 100
100 50 West 50 West 100 0 0
35 10 East 25 South 0 10 25
我已经研究过聚合和分裂,但似乎无法弄清楚如何让它们在这么多列中工作。我也在考虑一个冗长的“if”语句,它会旋转所有8个变量及其相应的位置,但我觉得必须有一个更好的解决方案。观察结果被加权用于调查包中,我希望避免重复观察并使用重塑包装使它们“长”,尽管我可以稍后重新组合它们。任何建议赞赏!
非常感谢, 路加
答案 0 :(得分:0)
首先,我将数据框转换为长形式,其中有3列:值,位置,大小写。 case应指明数据来自哪种情况(例如行)。订单没关系。所以你的数据框看起来像:
Value Loc Case
20 East 1
20 South 2
...
10 East 1
依此类推...... 一种方法是堆叠您的值和位置,然后手动(并轻松)添加案例编号。假设您的原始数据框名为df,并且在第2,4列中具有值,在第3,5列中具有位置
v.col = stack(df[,c(2,4)])[,1]
v.loc = stack(df[,c(3,5)])[,1]
v.case = rep(1:nrow(df),2)
long.data = data.frame(v.col,v.loc,v.case) # this is not actually needed, but just so you can view it
现在使用tapply创建你需要的列
s = tapply(v.col,list(v.case,v.loc),sum,na.rm=T)
new.df = cbind(df,s)
您可能需要将NA调整为0或其他,但这应该很容易。
使用plyr / reshape包也可能有更简单的方法,但我不是这方面的专家。
希望这有帮助