r - 使用 R 将特定的行值转换为列
问题描述
我有一个类似于下面列出的数据集
v1 <-c('name1','0/0','0/1','1/1','name2','0/0','1/1','name3','0/0','0/1','1/1','name4','0/0','0/1','1/1','name5','0/0','1/1')
v2 <- c(NA,95,3,2,NA,98,2,NA,93,5,2,NA,94,3,3,NA,96,4)
df <- cbind(v1,v2)
df <- as.data.frame(df)
df
看起来像:
v1 | v2 |
---|---|
名称1 | 不适用 |
0/0 | 95 |
0/1 | 3 |
1/1 | 2 |
名称2 | 不适用 |
0/0 | 98 |
1/1 | 2 |
名称3 | 不适用 |
0/0 | 93 |
0/1 | 5 |
1/1 | 2 |
如何将数据框重塑为:
名字 | 0/0 | 0/1 | 1/1 |
---|---|---|---|
名称1 | 95 | 3 | 2 |
名称2 | 98 | 不适用 | 2 |
名称3 | 93 | 5 | 2 |
使用 reshape 我得到的最接近的是:
v1 | 0/0 | 0/1 | 1/1 |
---|---|---|---|
1 | 95 | . | . |
2 | . | 3 | . |
3 | . | . | 2 |
4 | 98 | . | . |
5 | . | . | 2 |
谢谢!
解决方案
这个怎么运作:
- 创建一个
id_Group
group_split
经过id_Group
- 现在你有一个数据框列表
my_list
- 用于列表中的所有数据
lapply
框pivot_wider
- 用于
bind_rows
将数据框列表合并为一个数据框 - 通过随后的一些调整来使用该
name
列:pivot_longer
library(tidyverse)
my_list <- df %>%
mutate(id_Group = cumsum(is.na(v2))) %>%
group_split(id_Group)
df_list <- lapply(1:length(my_list),
function(x) (pivot_wider(my_list[[x]], names_from = v1, values_from = v2)))
bind_rows(df_list) %>%
pivot_longer(
cols = starts_with("name"),
names_to = "name"
) %>%
group_by(id_Group) %>%
filter(row_number()==1) %>%
ungroup() %>%
select(name, contains("/"), -id_Group, -value)
name `0/0` `0/1` `1/1`
<chr> <chr> <chr> <chr>
1 name1 95 3 2
2 name1 98 NA 2
3 name1 93 5 2
4 name1 94 3 3
5 name1 96 NA 4
推荐阅读
- angularjs - 在日期选择器中更改工作日的标题
- javascript - 在纯 JavaScript 中更改函数
- python - jQuery 脚本未在 Flask 中显示
- c# - 如何解决字符串必须恰好是一个字符长?C# .net 错误
- excel - 尝试比较两个excel文件的内容并通过python保存差异
- python - 了解在字典中查找最长键的函数
- windows - 在域中使用 powershell 查找安装了打印机的打印服务器
- html - 从 XSL 文档创建 XSLT 工作表?不工作?完成了 XLT 文档和 XLS 样式表
- java - 泛型返回类型 E
- java - Spring BOOT 1.5.6 的性能问题