r - 如何通过在 R 中生成新列来拆分这些数据
问题描述
我有 35 列,数据类似于此示例
df<-read.table (text=" Id Name Group MN AZ KL Norm
2 John P1 12 7 17 21
11 Sarah W1 11 8 12 20
2 John L1 13 9 19 20
11 Sarah N1 14 12 16 18
", header=TRUE)
我想得到这些数据:
id Name Group1 MN1 AZ1 KL1 Norm1 Group2 MN2 AZ2 KL2 Norm2
2 John P1 12 7 17 21 L1 13 9 19 20
11 Sarah W1 11 8 12 20 N1 14 12 16 18
按组拆分的数据。我有一个解决方案可以通过基本的 rcode 或仅 dplyr 对这些数据进行排序。如您所见,列名称未拆分
解决方案
不建议使用具有相似列名的数据框。对于每一个Id
,我们可以创建一个行号列,它可以以宽格式附加到列名。
library(dplyr)
df %>%
group_by(Id) %>%
mutate(row = row_number()) %>%
tidyr::pivot_wider(names_from = row, values_from = Group:Norm) %>%
select(Id, order(readr::parse_number(names(.))))
# Id Group_1 MN_1 AZ_1 KL_1 Norm_1 Group_2 MN_2 AZ_2 KL_2 Norm_2
# <int> <chr> <int> <int> <int> <int> <chr> <int> <int> <int> <int>
#1 2 P1 12 7 17 21 L1 13 9 19 20
#2 11 W1 11 8 12 20 N1 14 12 16 18
parse_number
返回一个警告,因为Id
没有数字,但忽略它是安全的。
data.table
如果列的顺序不重要,您也可以使用。
library(data.table)
dcast(setDT(df), Id~rowid(Id), value.var = c('Group', 'MN', 'AZ', 'KL', 'Norm'))
数据
df <- structure(list(Id = c(2L, 11L, 2L, 11L), Group = c("P1", "W1",
"L1", "N1"), MN = c(12L, 11L, 13L, 14L), AZ = c(7L, 8L, 9L, 12L
), KL = c(17L, 12L, 19L, 16L), Norm = c(21L, 20L, 20L, 18L)),
class = "data.frame", row.names = c(NA, -4L))
推荐阅读
- c++ - 可以在 C++ 中将数据永久存储到文本文件中
- python - 在 Linux 中 grep ppid 1 进程的 Python 脚本
- java - 如何检测 Admob 插页式广告被用户点击?
- android - 如何检索部署在用 Delphi 编写的 Android 应用程序中的文件
- rabbitmq - 如何避免重复发送消息
- javascript - Javascript中函数调用之间的变量状态
- javascript - Angular获取以数字为键的数组并将它们分配给我的变量
- ajax - ajax返回后vuejs刷新模板
- php - PDOException::("找不到驱动程序") Laravel & sql server
- angular - 角度 4 中的多个 api 调用