R: Быстрый способ выбора ячеек данных на основе их длины - PullRequest
0 голосов
/ 02 мая 2018

У меня большой фрейм данных, и я хочу установить подкадр данных на основе длины строки.

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

Например:

Column1   Column2                Column3             Column4
A1    Hotels in London, UK   Hotels in London        Hotels

Если len (column2) <30, тогда я хочу столбец 2, иначе, если len (column3) <30, тогда я хочу column3, иначе я хочу столбец 4. </p>

т.е. Я предпочитаю column2> column3> column 4, но для них допустимо ограничение на количество символов до 30.

В настоящее время у меня есть цикл, который занимает

 for(i in 1:nrow(df) {
  if(nchar(df$`C2`[i]) <= 30) {
    df[i]$`selected` <- df`C2`[i]
  } else if(nchar(df$`C3`[i]) <= 30) {
    df$`selected`[i] <- df$`C3`[i]
  } else (nchar(df$`C4[i]) <= 30) {
     df$`selected`[i]<- df$`C4`[i]

Ответы [ 2 ]

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

Вы можете использовать case_when в dplyr для условного выбора определенного столбца. Он векторизован, поэтому должен выполняться быстрее, чем цикл.

library(dplyr)
df %>% mutate(selected = case_when(nchar(Column2)<30 ~ Column2,
                               nchar(Column2)>30 & nchar(Column3)<30 ~ Column3,
                               nchar(Column2)>30 & nchar(Column3)>30 ~ Column4
                               ))
0 голосов
/ 02 мая 2018

Это должно работать:

DF$Selected <- sapply(seq_len(nrow(DF)),
                      function(i) DF[i,which(nchar(DF[i,-1]) <= 30)[1] + 1] )

Краткое объяснение

Для каждого индекса строки i мы:

  • выберите значения столбцов строки i (исключая первый столбец), и мы сохраним их nchar:
    nchar(DF[i,-1])
  • взять первый индекс ранее вычисленного nchars, который равен <= 30:
    which(nchar(DF[i,-1]) <= 30)[1]
  • затем мы используем этот индекс для выбора столбца (нам нужно добавить +1 к этому индексу, так как мы не рассматривали первый столбец)
  • используйте sapply предыдущие операции для каждого i в 1:nrow(DF)* и возвращайте вектор, который мы сохраняем, в новый столбец DF с именем Select

(*)

seq_len(nrow(DF)) логически эквивалентно 1:nrow(DF), но безопаснее, потому что если DF не имеет строки, он вернет пустой вектор, а 1:nrow(DF) вернет c(1,0) (обычно создавая «нечетные» результаты)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...