r - 使用 Pivot_Longer() 和 Pivot_Wider (Tidyverse) 转置小标题
问题描述
关于这个主题的类似问题都使用了已退休的 Tidyverse 函数的 spread() 和 gather()。假设我有一个这样的小标题:
people 1 2 3. 4 5
person1 27000 30000 40000 50000 60000
person2 27000 30000 40000 50000 60000
person3 27000 30000 40000 50000 60000
person4 27000 30000 40000 50000 60000
我想这样转置
People Person1 Person2 Person3 Person4 Person5
1. 270000 270000 270000. 270000. 270000
2. 30000. 30000. 30000 30000. 30000
3
4
5. 60000. 60000. 60000 60000 60000
(没有填写第三和第四列只是为了节省自己的时间,但它们应该已经填写了。
解决方案
它更容易data.table::transpose
library(data.table)
data.table::transpose(setDT(df1), make.names = 'people')[, People := .I][]
或使用tidyverse
,转置可以分两步完成,1),使用 重塑长格式pivot_longer
,2) 使用不同的列重塑回宽格式pivot_wider
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -people, names_to = 'People') %>%
pivot_wider(names_from = people, values_from = value)
# A tibble: 5 x 5
# People person1 person2 person3 person4
# <chr> <int> <int> <int> <int>
#1 1 27000 27000 27000 27000
#2 2 30000 30000 30000 30000
#3 3 40000 40000 40000 40000
#4 4 50000 50000 50000 50000
#5 5 60000 60000 60000 60000
数据
df1 <- structure(list(people = c("person1", "person2", "person3", "person4"
), `1` = c(27000L, 27000L, 27000L, 27000L), `2` = c(30000L, 30000L,
30000L, 30000L), `3` = c(40000L, 40000L, 40000L, 40000L), `4` = c(50000L,
50000L, 50000L, 50000L), `5` = c(60000L, 60000L, 60000L, 60000L
)), class = "data.frame", row.names = c(NA, -4L))
推荐阅读
- ruby-on-rails - 用于自动递增列的 Fluentd sql 输出插件配置
- sql - MS Access SQL 从分组数据中选择 MAX
- bash - 如何使base64对文件进行多次编码并将其输出到文件中?(bash)
- ios - NSURLSession:方法 dataTaskWithRequest 永远不会在冗长的响应中达到完成回调
- android - 如何在反应原生 webview 上启用暗模式?
- php - 从静态方法调用方法
- node.js - ../node_modules/ng2-ckeditor/ckbutton 中的错误。directive.d.TS:1:23 - 错误 TS2688:找不到“ckeditor”的类型定义文件
- c++ - 通过类型转换变量的地址来初始化引用
- c# - 程序启动时如何在控制文本框中获取今天的日期 C#
- android-studio - bluetooth LE startscan 未显示某些 API 级别的扫描结果