Разделение и замена символьной переменной в кадре данных в R

У меня есть кадр данных с несколькими символьными переменными разной длины, и я хотел бы преобразовать каждую переменную в список, где каждый элемент содержит каждое слово, разделенное пробелами.

Скажем, мои данные выглядят так:

char <- c("This is a string of text", "So is this")
char2 <- c("Text is pretty sweet", "Bet you wish you had text like this")

df <- data.frame(char, char2)

# Convert factors to character
df <- lapply(df, as.character)

> df
$char
[1] "This is a string of text" "So is this"              

$char2
[1] "Text is pretty sweet"                "Bet you wish you had text like this"

Теперь я могу использовать strsplit() для разделения каждого столбца по словам:

df <- transform(df, "char" = strsplit(df[, "char"], " "))
> df$char
[[1]]
[1] "This"   "is"     "a"      "string" "of"     "text"  

[[2]]
[1] "So"   "is"   "this"

Я хотел бы создать цикл или функцию, которая позволила бы мне сделать это для обоих столбцов одновременно, например:

for (i in colnames(df) {
    df <- transform(df, i = strsplit(df[, i], " "))
}

Однако это приводит к ошибке:

Error in data.frame(list(char = c("This is a string of text", "So is this",  : 
  arguments imply differing number of rows: 6, 8 

Я также пробовал:

splitter <- function(colname) {
    df <- transform(df, colname = strsplit(df[, colname], " "))
}

сплиттер (имена столбцов (df))

Что говорит мне:

Error in strsplit(df[, colname], " ") : non-character argument

Я не понимаю, почему вызов преобразования работает для отдельного столбца, но не при применении в цикле или функции. Любая помощь приветствуется!


person Charlie Thompson    schedule 23.04.2015    source источник
comment
Непонятно, что вы пытаетесь здесь сделать. Чтобы сохранить ваши строки как строки, просто выполните df <- data.frame(char, char2, stringsAsFactors = FALSE). Более того, понимаете ли вы, что lapply(df, as.character) возвращает список, а не фрейм данных? transform работает с фреймами данных, а не со списками. Наконец, каков желаемый результат? Вы хотите data.frame list? Этот вопрос очень сбивает с толку.   -  person David Arenburg    schedule 23.04.2015


Ответы (1)


Я получил желаемый результат без transform

char <- c("This is a string of text", "So is this")
char2 <- c("Text is pretty sweet", "Bet you wish you had text like this")
df <- data.frame(char, char2)
# Convert factors to character
df <- lapply(df, as.character)

я вставил

lapply(df, strsplit, split= " ")

Получить

$char
$char[[1]]
[1] "This"   "is"     "a"      "string" "of"     "text"  

$char[[2]]
[1] "So"   "is"   "this"


$char2
$char2[[1]]
[1] "Text"   "is"     "pretty" "sweet" 

$char2[[2]]
[1] "Bet"  "you"  "wish" "you"  "had"  "text" "like" "this"

И, как упомянул Алекс: первую лапшу из вашего кода df <- lapply(df, as.character) можно устранить, заменив df <- data.frame(char, char2) на df <- data.frame(char, char2, stringsAsFactors=FALSE)

person Pierre L    schedule 23.04.2015
comment
Вы можете упростить до lapply(df, strsplit, split=" "). Кроме того, нет необходимости lapply() получать символы; просто используйте df <- data.frame(char, char2, stringsAsFactors=FALSE). - person Alex A.; 23.04.2015
comment
Отличная идея! я добавлю это - person Pierre L; 23.04.2015