Как сделать каждую строку новым набором переменных и динамически переименовать их в r - PullRequest
1 голос
/ 14 февраля 2020

Сначала я хочу преобразовать эти данные:

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

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 14 февраля 2020

Мы можем использовать 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 из 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
...