【问题标题】:R create and populate new columns based on values in anotherR根据另一个值创建和填充新列
【发布时间】:2019-02-11 20:48:16
【问题描述】:

我陷入了 R 数据争论问题。我有一个如下所示的数据框 (df):

      loc     lat      long      group
 1    loc1    47.69119 -91.85776  A
 2    loc1    47.69119 -91.85776  B
 3    loc1    47.69119 -91.85776  C
 4    loc2    46.41079 -86.64089  C
 5    loc2    46.41079 -86.64089  C
 6    loc2    46.41079 -86.64089  C
 7    loc3    47.33673 -91.19876  D
 8    loc4    46.83937 -87.71222  A
 9    loc4    46.83937 -87.71222  E
 10   loc4    46.83937 -87.71222  E

我想做的是为 df$group 中的每个唯一值创建一个新列,然后使用每个 loc 观察每个组的次数来填充新列,并为每个只保留一行地点我希望最终产品看起来像这样:

      loc    lat      long       A  B  C  D  E
 1    loc1   47.69119 -91.85776  1  1  1  0  0
 2    loc2   46.41079 -86.64089  0  0  3  0  0
 3    loc3   47.33673 -91.19876  0  0  0  1  0
 4    loc4   46.83937 -87.71222  1  0  0  0  2

我认为我需要一些 dplyr 和/或 tidyr 功能的组合,但无法解决。我使用以下代码将每个 loc 和 group 的频率制成表格:

df.freq = df %>%
group_by(loc, group) %>%
summarise(Freq = n())

也许生成的 df.freq 可用于使用 tidyr 创建新列,如下所示:

tidyr::separate(df.freq, group, 
  as.character(unique(df.freq$group)))

但是我不确定如何填充每个新列并为每个位置只保留一行。

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    一种选择是根据 'loc'、'lat'、'long'、'group' 列获取 count,然后将 spread 转换为 'wide' 格式

    library(tidyverse)
    df %>% 
      count(loc, lat, long, group) %>%
      spread(group, n, fill = 0) 
    

    data.table 版本 (@markus cmets) 将是

    library(data.table)
    dcast(setDT(df), loc + lat + long ~ group)
    

    【讨论】:

    • 非常感谢@akrun,完美运行,代码很少!
    • 也感谢@markus,这是另一个运行良好的简单解决方案。
    • 可以进一步简化为tidyversedf %>% dcast(loc + lat + long ~ group)
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2021-01-24
    • 2021-03-16
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多