Я пытаюсь заменить несколько столбцов большого фрейма данных на основе индексации. То, что я хочу / сделал до сих пор, объединяет этот пост и этот пост. Позвольте мне привести пример для ясности.

Вот очень упрощенный пример данных в формате dput:

DF <-
structure(list(Fruits = structure(c(1L, 3L, 4L, 2L), 
.Label = c("Apples", "Avocado", "Oranges", "Pineapple"), 
class = "factor"), Weight2 = c(20L, 15L, 40L, 60L), 
Weight = c(2L, 4L, 8L, 5L), `Number` = c(10L, 
16L, 6L, 20L)), class = "data.frame", row.names = c(NA, -4L))

Fruits   Weight   Weight2   Number

  Apples      20      2          10
  Oranges     15      4          16
  Pineapple   40      8           6
  Avocado     60      5          20

То, что я хочу сделать, это для DF, учитывая список фруктов, изменить столбцы Weight и Weight2 на N. Я упомяну, что мой DF - это фактически список фреймов данных, а мой список - список списков, поэтому необходима индексация , Вот мой код до сих пор:

fruit.to.change <- c("Apples","Pineapple")  
DF$Weight[which(DF$Fruits == fruit.to.change)] <- "N" #change the first column but I want to change multiple columns.

colID <- grepl("Weight", names(DF))
which(DF$Fruits %in% fruit.to.change[1:length(fruit.to.change)]) #gets the positions matching

Но не знаете, как выбрать и заменить столбцы в colID? Я уверен, что это просто еще один уровень индексации, но не могу понять это. Я в основном хочу что-то вроде DF$Weight:Weight2 [which(DF$Fruits %in% fruit.to.change )] <- "N" Огромное спасибо.

1
KNN 18 Апр 2020 в 18:23

2 ответа

Лучший ответ

Мы можем подмножество строк с помощью fruit.to.change и столбцов с colID и заменить там, где условие выполняется, "N".

DF[DF$Fruits %in% fruit.to.change,colID] <- "N"
DF
#     Fruits Weight2 Weight Number
#1    Apples       N      N     10
#2   Oranges      15      4     16
#3 Pineapple       N      N      6
#4   Avocado      60      5     20
0
Ronak Shah 18 Апр 2020 в 15:26

Опция с dplyr будет

library(dplyr)
DF %>%
   mutate_at(vars(colID), ~ replace(., Fruits %in% fruit.to.change,  "NA"))
0
akrun 18 Апр 2020 в 20:00