R根据另一个

时间:2019-02-11 20:48:17

标签: r dplyr tidyr

我陷入了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函数的某种组合,但是还无法解决。我已使用以下代码将每个位置和组的频率列表化:

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

将是data.table版(@markus注释)

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