r - 如何使每一行成为一组新的变量并在 r 中动态重命名它们
问题描述
首先,我想转换这些数据:
datinput = read.table(header = TRUE, text = "
var1 var2 var3
A 3 10
B 2 6
")
datinput
var1 var2 var3
1 A 3 10
2 B 2 6
变成这种格式:
datoutput = read.table(header = TRUE, text = "
var2.A var3.A Var2.B var3.B
3 10 2 6
")
var2.A var3.A Var2.B var3.B
1 3 10 2 6
我试过了reshape2::dcast
了,但没有提供所需的输出。
相反, dcast 给出了这个:
datinput%>%reshape2::dcast(var1~var2, value.var="var3")
var1 2 3
1 A NA 10
2 B 6 NA
datinput%>%reshape2::dcast(var1, value.var=c("var2", "var3"))
Error in is.formula(formula) : object 'var1' not found
datinput%>%reshape2::dcast(var1~var1, value.var=c("var2", "var3"))
Error in .subset2(x, i, exact = exact) : subscript out of bounds
In addition: Warning message:
In if (!(value.var %in% names(data))) { :
the condition has length > 1 and only the first element will be used
然后,我想让 names_from 在新名称中排在第一位。
我想将这些新列命名为 A.var2 B.var2 A.var3 B.var3。这是因为我想使用变量名按字母顺序排列结果变量到 A.var2 A.var3 B.var2 B.var3
谢谢你的帮助。
解决方案
我们可以用pivot_wider
library(dplyr)
library(tidyr)
library(stringr)
datinput %>%
pivot_wider( names_from = var1, values_from = c('var2', 'var3'), names_sep=".") %>%
rename_all(~ str_replace(., '^(.*)\\.(.*)', '\\2.\\1'))
dcast
fromreshape2
不使用多个值列。相反,它可以用data.table::dcast
library(data.table)
dcast(setDT(datinput), rowid(var1) ~ var1, value.var = c("var2", "var3"), sep=".")
# var1 var2.A var2.B var3.A var3.B
#1: 1 3 2 10 6
推荐阅读
- bash - 获取 if 语句中的命令输出到变量中
- spring-boot - 如何调试 Spring Security Oath2 和 Jwt 以了解其工作原理
- ansible - 运行ansible playbook时遇到“无法访问”“权限被拒绝”错误
- java - 在 Eclipse 中使用正则表达式在 xml 文件中查找查询
- python - 为什么每个线程都得到一个新的 packageManager 对象副本?我怎么可以只用一个?
- azure-devops - ADO 项目的存档选项
- android - 在 Android 上的 NavigationButton 中将大小设置为图标
- java - WebClient 请求级别超时抛出称为默认 onErrorDropped 的运算符
- php - 转化上传:如何在每次转化上传时设置转化窗口?
- javascript - 从反应原生组件调用javascript函数