Вставить фрейм данных, не переходя в уровни факторов - PullRequest
0 голосов
/ 23 мая 2018

У меня есть векторы, скажем, a, b, c, d, как показано ниже:

 a <- c(1,2,3,4)
 b <- c("L","L","F","L")
 c <- c(11,22,33,44)
 d <- c("Y", "N", "Y","Y")

И я пытаюсь использовать пасту, чтобы получить этот вывод (1):

paste(a,b,c,d, sep = "$", collapse = "%")
[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

Затем я изменяю это на это, скажем, df:

df <- data.frame(a,b,c,d)

и получаю следующий вывод (2):

paste(df, sep = "$", collapse = "%")
[1] "c(1, 2, 3, 4)%c(2, 2, 1, 2)%c(11, 22, 33, 44)%c(2, 1, 2, 2)"

Мой вопрос: (1) Может кто-нибудь объяснить мне, почемув df он меняет свои элементы на числовые?(2) Есть ли другой способ, которым я могу использовать df для получения вывода (1)?

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

Вот подход dplyr:

pull(summarise(unite(df, tmp, 1:ncol(df), sep="$"), paste(tmp, collapse="%")))

Или:

df %>%
  unite(tmp, 1:ncol(df),sep="$") %>%
  summarise(output = paste(tmp, collapse="%")) %>%
  pull()
0 голосов
/ 23 мая 2018

Вы не можете напрямую применить paste к фрейму данных для вашего случая здесь, чтобы получить желаемый результат, вам нужно применить paste на двух уровнях.

paste(apply(df, 1, function(x) paste(x, collapse = "$")), collapse = "%")

#[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

Где команда apply создает построчный вектор

apply(df, 1, function(x) paste(x, collapse = "$"))
#[1] "1$L$11$Y" "2$L$22$N" "3$F$33$Y" "4$L$44$Y"

, а следующая команда paste объединяет их все вместе с аргументом collapse как "%".

0 голосов
/ 23 мая 2018

paste запускает as.character (или что-то похожее внутри) на своих ... аргументах, эффективно выводя из списка.Посмотрите на

as.character(df)
# [1] "c(1, 2, 3, 4)"     "c(2, 2, 1, 2)"     "c(11, 22, 33, 44)" "c(2, 1, 2, 2)"    
deparse(df$a)
# [1] "c(1, 2, 3, 4)"

Ваш код вставляет эти значения вместе.Чтобы обойти это, вы можете использовать do.call.

do.call(paste, c(df, sep = "$", collapse = "%"))
# [1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"
0 голосов
/ 23 мая 2018

Вот альтернатива подходу, который вы использовали:

df_call <- c(df, sep="$")
paste(do.call(paste, df_call), collapse="%")

[1] "1$L$11$Y%2$L$22$N%3$F$33$Y%4$L$44$Y"

Демо

...