Подтвердить что ты не робот

Пронумеруйте столбцы и добавьте длины строк в виде новых столбцов

У меня есть кадр данных с числом столбцов и хотел бы вывести отдельный столбец для каждого с длиной каждой строки в нем.

Я пытаюсь выполнить итерацию по именам столбцов, и для каждого столбца выдается соответствующий столбец с прикрепленной "_length".

Например, col1 | col2 отправится в col1 | col2 | col1_length | col2_length

Используемый мной код:

df <- data.frame(col1 = c("abc","abcd","a","abcdefg"),col2 = c("adf qqwe","d","e","f"))

for(i in names(df)){
  df$paste(i,'length',sep="_") <- str_length(df$i)
 }

Однако эти броски и ошибки: недопустимая функция в сложном назначении. Могу ли я использовать петли таким образом в R?

4b9b3361

Ответ 1

Вам нужно использовать [[, программный эквивалент $. В противном случае, например, когда i равно col1, R будет искать df$i вместо df$col1.

for(i in names(df)){
  df[[paste(i, 'length', sep="_")]] <- str_length(df[[i]])
}

Ответ 2

Вы можете использовать lapply, чтобы передать каждый столбец в str_length, а затем cbind к исходному data.frame...

library(stringr)

out <- lapply( df , str_length )    
df <- cbind( df , out )

#     col1     col2 col1 col2
#1     abc adf qqwe    3    8
#2    abcd        d    4    1
#3       a        e    1    1
#4 abcdefg        f    7    1

Ответ 3

С dplyr и stringr вы можете использовать mutate_all:

> df %>% mutate_all(funs(length = str_length(.)))

     col1     col2 col1_length col2_length
1     abc adf qqwe           3           8
2    abcd        d           4           1
3       a        e           1           1
4 abcdefg        f           7           1

Ответ 4

Для полноты существует также решение data.table:

library(data.table)
result <- setDT(df)[, paste0(names(df), "_length") := lapply(.SD, stringr::str_length)]
result
#      col1     col2 col1_length col2_length
#1:     abc adf qqwe           3           8
#2:    abcd        d           4           1
#3:       a        e           1           1
#4: abcdefg        f           7           1