如何使每一行成为一组新变量并在r中动态重命名它们

问题描述 投票:1回答:1

首先,我要转换此数据:

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

感谢您的帮助。

r pivot reshape data-manipulation dcast
1个回答
3
投票
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中的reshape2不使用多个值列。相反,可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.