r - 使用转置传播数据帧
问题描述
假设我有以下数据框
ID <- c("Tom" , "Tom", "Ana", "Ana", "Lena", "Lena")
Use <- c("F", "T", "T", "F", "T", "T")
df <- data.frame(ID, Use)
我想得到一个新的数据框,其中每一行是一个人,每一列是 Use1,Use2 的人。(每个人关联2个用途)
即我会等
Use1 <- c("F" , "T", "T")
Use2 <- c("T", "F", "T")
df_wanted <- data.frame(Use1, Use2)
那么理想情况下,row.names 将是人名,因此第 1 行是“Tom”,第 2 行是“Ana”,第 3 行是“Lena”。
我怎样才能做到这一点?我试过了gather
,spread
但melt
似乎找不到办法。
解决方案
您可以使用以下解决方案。我只是想我会解释names_glue
论点:
- 您可以尝试不带
names_glue
参数的解决方案,您将看到您的新列名最终会像1
&2
。但是,如果您想为重塑的数据集创建一个自定义名称,您可以在语法中使用.value
参数。glue
通过这种方式,我们将变量名称放入大括号{}
中,以便将它们作为 R 代码进行评估。在这里,我们指定我们首先需要df
从 (Use
) 中获取值的列的名称,然后是id
列的值。我们还可以进行其他修改,例如添加下划线等
library(tidyr)
df %>%
group_by(ID) %>%
mutate(id = row_number()) %>%
pivot_wider(names_from = id, values_from = Use, names_glue = "{.value}{id}")
# A tibble: 3 x 3
# Groups: ID [3]
ID Use1 Use2
<chr> <chr> <chr>
1 Tom F T
2 Ana T F
3 Lena T T
推荐阅读
- laravel - 从 Laravel 5.7 迁移到 6.x 后,Cookie 字符串会发生变化
- c# - 将数据从两个表单插入到 SQL 表中 C# winform
- python - 具有多对多字段的自定义过滤器
- java - 流分组按子类型
- javascript - 如何使用 React 和 Axios 从 API 返回 h1 元素
- java - 缩小的 APK 在运行时崩溃
- python - Scapy Sniff() 在没有过滤器的情况下不捕获任何数据包(Windows 10)
- r - if (is.na(n) || n > 65536L) stop("size 不能为 NA 也不能超过 65536") 中的错误
- javascript - Javascript:是否可以在画布中为形状的 fillRect 设置动画?
- android - 从自定义应用程序类设置 liveData