【问题标题】:dplyr group_by and summarize for two df's with same column namedplyr group_by 并汇总两个具有相同列名的 df
【发布时间】: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‎

标签: r dataframe dplyr


【解决方案1】:

你可以试试:

df2%.%filter(x%in%df1$x)%.%group_by(x)%.%summarise(sum(z))

【讨论】:

    【解决方案2】:

    根据@beginneR 的评论,我猜它会是这样的:

    inner_join(df1, df2) %.% group_by(x) %.% summarise(z=sum(z))
    
    Joining by: "x"
    Source: local data frame [10 x 2]
    
       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
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2021-01-19
      • 2021-08-21
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2022-07-25
      • 2021-11-14
      • 1970-01-01
      相关资源
      最近更新 更多