Выбрать поле Specifi c и значение ячейки рядом с ним на основе условия, используя R - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть фрейм данных, и я хочу получить значение столбца и значение ячейки рядом с ним в отдельных новых столбцах. Условие состоит в том, что мне нужны только те полки, на которых присутствуют элементы A и B, и их соответствующая цена продажи. Для чего-то еще следует получить NA. Я привел пример ввода и ожидаемого выхода. Я пробовал различные варианты, такие как объединение и использование регулярного выражения, но не смог достичь желаемого результата.

df_input <- data.frame (shelf_1  = c('A','A','B','C','C','D'),
                  selling_price_s1 = c(20000, 23000, 26000,25000,24000,20000),
                  shelf_2  = c('D','C','C','A','A','D'),
                  selling_price_s2 = c(23000, 25000, 25000,21000,22000,25000),
                  shelf_3  = c('C','D','D','C','NA','C'),
                  selling_price_s3 = c(20000, 23000, 26000,25000,NA,20000),
                  )

df_expected <- data.frame (shelf  = c('A','A','B','A','A','NA'),
                  selling_price = c(20000, 23000, 26000,21000,22000,NA),
                  )

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Использование data.table:

library(data.table)
setDT(df_input)

df_input[, melt(.SD, measure = patterns("^shelf", "^selling_price_s"))
         ][value1 %chin% c("A", "B", "NA")]

   variable value1 value2
1:        1      A  20000
2:        1      A  23000
3:        1      B  26000
4:        2      A  21000
5:        2      A  22000
6:        3     NA     NA

PS. если вы правильно отформатируете NA, вам нужно добавить |is.na(value1) на последнем шаге.

Альтернатива Base R:

df_out <- data.frame(
  shelf = as.character(unlist(df_input[grep("shelf", names(df_input))])),
  selling_price = unlist(df_input[grep("selling_price", names(df_input))], use.names = FALSE)
)
df_out
df_out[df_out$shelf %in% c("A", "B", "NA"), ]

Воспроизводимые данные:

df_input <- data.frame(
  shelf_1  = c('A', 'A', 'B', 'C', 'C', 'D'),
  selling_price_s1 = c(20000, 23000, 26000, 25000, 24000, 20000),
  shelf_2  = c('D', 'C', 'C', 'A', 'A', 'D'),
  selling_price_s2 = c(23000, 25000, 25000, 21000, 22000, 25000),
  shelf_3  = c('C', 'D', 'D', 'C', 'NA', 'C'),
  selling_price_s3 = c(20000, 23000, 26000, 25000, NA, 20000)
)
0 голосов
/ 14 февраля 2020

В базе R:

cols <- c("shelf", "value")
subset(rbind(setNames(df_input[1:2], cols), 
             setNames(df_input[3:4], cols), 
             setNames(df_input[5:6], cols)),
       shelf == "A" | shelf == "B" | shelf == "NA")) 

#>    shelf value
#> 1      A 20000
#> 2      A 23000
#> 3      B 26000
#> 10     A 21000
#> 11     A 22000
#> 17    NA    NA
...