Есть ли способ вставить оператор с именами столбцов и использовать его для создания нового столбца в R? - PullRequest
1 голос
/ 06 мая 2020

У меня есть df,

df <- data.frame(X1 = c('1','0', '1','1', '1'), X2 = c('1','0', '1','0', '1'), X3 = c('1','0', '1','0', '1'), X4 = c('1','0', '1','0', '1'))

И я хотел бы создать несколько тестовых наборов по столбцам, которые говорят:

'1 & 0 & 1 & 1 & 1'

И так для каждой строки. Мой ожидаемый результат:

df <- data.frame(X1 = c('1','0', '1','1', '1'), X2 = c('1','0', '1','0', '1'), X3 = c('1','0', '1','0', '1'), X4 = c('1','0', '1','0', '1'), tc= c("1 & 1 & 1 & 1", "0 & 0 & 0 & 0", "1 & 1 & 1 & 1", "1 & 0 & 0 & 0", "1 & 1 & 1 & 1"))

Я не уверен, что это самый простой способ сделать это. Но я создаю строку с noquote, toString и lapply:

string <-  noquote(toString(lapply(1:3, function(x){noquote(sprintf("df$X%s, '&'", x))})))
string
#df$X1, '&', df$X2, '&', df$X3, '&'

И пытаюсь активировать ее с помощью paste


df$tc <- paste(string, df$X4)

Однако он вставляет только последнее значение из X4, заставляя мои тестовые примеры выглядеть например:

head(df$tc)

[1] "df$X1, '&', df$X2, '&', df$X3, '&' 1" "df$X1, '&', df$X2, '&', df$X3, '&' 0"
[3] "df$X1, '&', df$X2, '&', df$X3, '&' 1" "df$X1, '&', df$X2, '&', df$X3, '&' 0"
[5] "df$X1, '&', df$X2, '&', df$X3, '&' 1"

Единственное решение, которое я нашел, - скопировать созданную мной строку в оператор вставки


df$tc <-paste(df$X1, '&', df$X2, '&', df$X3, '&', df$X4)

Однако это выглядит не очень хорошо, и иногда у меня есть больше чем 100 тестовых случаев и очень длинная строка.

Есть ли способ вставить результаты вот так;

df$tc <- paste(string, df$X4)

Или есть более умный подход?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

дополнительное решение

library(stringr)
df$tc <- apply(df, 1, function(x) str_c(x, collapse = " & "))
2 голосов
/ 06 мая 2020

Мы можем использовать do.call с paste

df$tc <- do.call(paste, c(df, sep=" & "))
df$tc
#[1] "1 & 1 & 1 & 1" "0 & 0 & 0 & 0" "1 & 1 & 1 & 1" "1 & 0 & 0 & 0" "1 & 1 & 1 & 1"

Или с reduce и str_c

library(dplyr)
library(purrr)
library(stringr)
df %>%
    mutate(tc = reduce(., str_c, sep=" & "))
...