【问题标题】:R - Grouping values within a df [duplicate]R - df中的分组值[重复]
【发布时间】:2022-01-08 13:27:48
【问题描述】:

我有一个 df,其中每个条目都有一个分配的分组 ID,例如:

id_person income id_family
001       100    A1
002       120    B2
003       100    B5
004       220    A1
005       300    A2

现在我需要为每个 id_person 分配一个新变量,将所有具有相同 id_family 的条目的变量 income 相加。如:

id_person income id_family family_income
001       100    A1        220
002       120    B2        120
003       100    B5        400
004       220    A1        220
005       300    B5        400

我不想创建一个新的grouped_df,我现在也不需要查看这个变量的汇总。

如何使用 R 给出这个命令?

【问题讨论】:

  • 数据集中的第二个 A1 应该是 220 吗?而不是230?我很难理解family_income的值来自哪里@
  • 另外,id_family 看起来也很奇怪。
  • id_family 中使用的字母使其成为一个简单的示例,在视觉上与 id_person 不同。对不起 230。

标签: r dataframe group-by


【解决方案1】:

使用 data.table 中的数据,我们可以通过分组变量(by=)对变量执行操作,然后使用 data.table 赋值运算符 := 将其分配回数据

library(data.table)
setDT(df)
df[, "family_income" := sum(income), by = id_family]

data.table 数据结构是 R data.frame 的升级版,提供更多功能和效率提升。如果DT 是您的data.table,DT[i, j, by] 是表示我们如何使用i 对数据进行排序或子集化,j 用于选择或计算变量,by 用于执行j-对组的操作。例如,对于 100 马力以上的汽车,自动 (0) 和手动 (1) 汽车的平均燃油效率是多少?

dtcars <- data.table(mtcars)
dtcars[hp>100, mean(mpg), by=am]

返回:

> dtcars[hp>100, mean(mpg), by=am]
   am       V1
1:  1 20.61429
2:  0 16.06875

【讨论】:

  • 确实很棒的解决方案!不知道by 选项。
  • 为什么我在使用View()函数时看不到向量family_income
  • 你是用:=还是只用=
  • 当您在控制台中执行数据表的名称时会发生什么 - 它是否返回任何内容?
【解决方案2】:
df %>% 
  group_by(id_family) %>% 
  summarise(Total = sum(income, na.rm = TRUE))

或者可以使用across()函数:

df %>%
  group_by(id_family) %>%
  summarise(across(income, sum))

【讨论】:

    【解决方案3】:

    你可以试试

    数据

    df <- read.table(text = "id_person income id_family
    001       100    A1
    002       120    B2
    003       100    B5
    004       220    A1
    005       300    B5", header = T)
    
      id_person income id_family
    1         1    100        A1
    2         2    120        B2
    3         3    100        B5
    4         4    220        A1
    5         5    300        B5
    

    代码

    library(dplyr)
    
    df %>%
      group_by(id_family) %>%
      mutate(family_income = sum(income)) %>%
      ungroup
        
      id_person income id_family family_income
          <int>  <int> <chr>             <int>
    1         1    100 A1                  320
    2         2    120 B2                  120
    3         3    100 B5                  400
    4         4    220 A1                  320
    5         5    300 B5                  400
    

    【讨论】:

    • 我现在不能自己尝试:工作+学习+育儿真的很难。但我相信这个答案是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2020-11-28
    • 2022-01-16
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多