R создавать и заполнять новые столбцы на основе значений в другом - PullRequest
0 голосов
/ 11 февраля 2019

Я застрял в проблеме спора 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 $, а затем использоватьколичество раз, которое каждая группа наблюдается для каждого местоположения, чтобы заполнить новые столбцы, и сохранить только одну строку для каждого местоположения.Я бы хотел, чтобы конечный продукт выглядел так:

      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 и группы, используя следующий код:

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

Возможно, полученный результирующий df.freq можно использовать для создания новых столбцов, используя tidyr, следующим образом:

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

Но тогда я не уверен, как заполнить каждый новый столбец и сохранить только одну строку для каждого loc.

1 Ответ

0 голосов
/ 12 февраля 2019

Один из вариантов - получить count на основе столбцов «loc», «lat», «long», «group», а затем spread в «широкий» формат

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

A data.table версия (@markus comments) будет

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