【发布时间】:2014-06-23 12:41:15
【问题描述】:
假设您有以下两个 data.frame:
set.seed(1)
x <- letters[1:10]
df1 <- data.frame(x)
z <- rnorm(20,100,10)
df2 <- data.frame(x,z)
(请注意,两个 dfs 都有一个名为“x”的列)
并且您想像这样总结 df1 中“x”组的 df2$z 的总和:
df1 %.%
group_by(x) %.%
summarize(
z = sum(df2$z[df2$x == x])
)
这会返回一个错误“invalid indextype integer”(已翻译)。
但是当我在两个 df 中的任何一个中更改列“x”的名称时,它可以工作:
df2 <- data.frame(x1 = x,z) #column is now named "x1", it would also work if the name was changed in df1
df1 %.%
group_by(x) %.%
summarize(
z = sum(df2$z[df2$x1 == x])
)
# x z
#1 a 208.8533
#2 b 205.7349
#3 c 185.4313
#4 d 193.8058
#5 e 214.5444
#6 f 191.3460
#7 g 204.7124
#8 h 216.8216
#9 i 213.9700
#10 j 202.8851
我可以想象在很多情况下,您有两个具有相同列名(如“ID”列)的 df,这可能是个问题,除非有简单的解决方法。
我错过了什么吗?对于此示例,可能还有其他方法可以获得相同的结果,但我有兴趣了解这在 dplyr 中是否可行(或者为什么不可行)。
(这两个 df 不一定需要具有与本示例中相同的唯一“x”值)
【问题讨论】:
-
@Arun 你能证明这在示例中是如何工作的吗?
-
@Arun 感谢您提供示例。这似乎是一个采用不同方法的好解决方案。我想知道是否可能存在其他情况(可能在汇总函数中更复杂),在这些情况下使用我的问题中指出的方法可能仍然非常有用(但现在我想不出一个很好的例子)
-
我认为问题主要源于您拥有数据的方式。
dplyr旨在作为处理“整洁”数据的工具,而您的不是。更好的方法是加入两个数据框(如 Arun 建议的那样)并处理新数据集。 Hadley 撰写的关于该主题的非常有趣的读物:vita.had.co.nz/papers/tidy-data.pdf