r - R根据另一个值创建和填充新列
问题描述
我被困在一个 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 保留一行。我希望最终产品看起来像这样:
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)))
但是我不确定如何填充每个新列并为每个位置只保留一行。
解决方案
一种选择是count
基于列'loc'、'lat'、'long'、'group'然后spread
获取'wide'格式
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)
推荐阅读
- python - 如何从python中的keccak 256哈希值中找到原始值?
- javascript - 如何使用 vuelidate 访问另一个字段
- javascript - Axios - 打印完整的响应对象
- python - 如何在pyspark中获取日期列的最大值
- delphi-xe5 - TeeChart 无法使用 LoadChartFromStream 加载我的自定义属性
- spring - 有没有办法将系统变量注入 Spring 库?
- eclipse - 如何将源文件附加到他们的 eclipse 插件依赖 jar 以查看 javadocs?
- pygame - 为什么pygame的功能在重启时不起作用?(如何重置 pygame 功能?)
- reactjs - 如何使用无头 js 在本机反应中实现后台任务,以便 fetch api 在所有 3 种状态下无限运行
- sql - 在整数列上使用 Like 运算符进行过滤