r - 创建只有 1 个 ID 列的宽数据
问题描述
我有一个看起来像这样的数据框:
ID Code_Type Code date
1 10 4 1
1 9 5 2
2 10 6 3
2 9 7 4
我希望它看起来像这样:
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
不同的日期在同一行上有不同的列。
我目前的代码是这样的:
#Example df
df <- data.frame("ID" = c(1,1,2,2),
"Code_Type" = c(10,9,10,9),
"Code" = c(4,5,6,7),
"date"= c(1,2,3,4))
spread(df, Code_Type,Code)
这输出:
ID date 9 10
1 1 NA 4
1 2 5 NA
2 3 NA 6
2 4 7 NA
这与我想要的类似我只是不知道如何使日期列变成多列。任何帮助或额外阅读表示赞赏。
为了澄清这是我预期的输出数据框
ID date.1 date.2 9 10
1 1 2 5 4
2 3 4 7 6
解决方案
这是一个dplyr
/tidyr
替代方案:
df %>% mutate(date.1 = date %% 2 * date) %>% mutate(date.2 = - (date %% 2 - 1) * date) %>% select(-date) %>% spread(Code_Type, Code) %>% group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
# A tibble: 2 x 5
ID date.1 date.2 `9` `10`
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 2 5 4
2 2 3 4 7 6
这个想法是将date
列分成两列,无论date
是偶数还是奇数。这是使用模 ( %%
) 运算符(以及一些额外的数字运算)完成的。date.1 = date %% 2 * date
捕获日期中的奇数并且0
适用于所有其他人;date.2 = - (date %% 2 - 1) * date
抓住偶数并0
适用于所有其他人。
之后就很简单了:选择除date
;之外的所有列 将其扩展为宽格式,再次有点棘手,总结ID
并删除所有NA
s ( group_by(ID) %>% summarise_all(list(~ sum(.[!is.na(.)])))
.
推荐阅读
- java - Java 使用 OpenCV 和 FFMPEG 来获取 Videocapture 网络摄像头图像
- arrays - 正确检测 Perl 子例程参数是否为数组
- java - 这种声明的类型是什么?
- python - Scrapy不发送帖子请求
- kubernetes - Rancher 的掌舵操作失败
- xml - 在 StaxEventItemReader 中获取 XML 中的属性名称和值
- html - 为什么我的 wrapper(div) 没有显示在我的页面预览中?
- python - list.sort(reverse = True) 不将列表更改为降序
- java - java.nio.file.Files 等效于 java.io.File.setWritable() 是什么?
- c++ - 特征矩阵向量乘法 w/noalias