我陷入了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)))
但是我不确定如何填充每个新列,并且每个位置只保留一行。
答案 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)