Использование функции apply для строк data.frame в R - PullRequest
2 голосов
/ 21 марта 2020

У меня есть data.frame:

df<-data.frame(x=c(1,2,3),y=c('b','a','c'))

Если я наберу:

as.character(df[1,])

Я получу:

"1" "2"

Или если я наберу:

paste(df[1,],collapse=':')

Я получу:

1:2

Но если я наберу:

apply(df,1,as.character) или apply(df,1,paste,collapse=':')

, я получу:

[1,] "1"  "2"  "3" 
[2,] "b"  "a"  "c" 

и

"1:b" "2:a" "3:c"

Я предположил, что запуск функции apply приведет к тому, что каждая строка df будет приведена к вектору, а затем будет применена функция, например as.character () или paste ()

Однако, похоже, это не так. Может кто-нибудь объяснить, что происходит в этой ситуации и почему он дает другой ответ на следующий вопрос:

paste(df[1,],collapse=":"), затем paste(df[2,],collapse=":"), затем paste(df[3,],collapse=":")

Ответы [ 2 ]

3 голосов
/ 21 марта 2020

Проблема заключается в том, что строковые столбцы относятся к классу factor, поскольку при построении data.frame параметр по умолчанию равен stringsAsFactors = TRUE, и factor будет принудительно переведен в режим целочисленного хранения, когда мы сделаем paste для столбцов. , Чтобы избежать такого поведения, используйте

df <- data.frame(x=c(1,2,3),y=c('b','a','c'), stringsAsFactors = FALSE)

paste(df[1,],collapse=":")
#[1] "1:b"

С apply она преобразуется в matrix, а матрица может иметь только один класс, поэтому она преобразует число c в «символ», когда есть символьный элемент, основанный на приоритете класса

2 голосов
/ 21 марта 2020

Полагаю, объяснение @ akrun может быть вам уже вполне понятно, где проблема вызвана factor при попытке paste(df[1,],collapse=":").

Вот альтернатива, которая может обойти проблему, то есть, используя

do.call(paste,c(df,sep = ":"))[1]

для вашей цели, например

> do.call(paste,c(df,sep = ":"))[1]
[1] "1:b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...