Использование 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)
)