заменить несколько столбцов фрейма данных с индексацией в г - PullRequest
1 голос
/ 18 апреля 2020

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

Вот очень упрощенный пример данных в формате 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 to 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" ОЧЕНЬ большое спасибо.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

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

library(dplyr)
DF %>%
   mutate_at(vars(colID), ~ replace(., Fruits %in% fruit.to.change,  "NA"))
0 голосов
/ 18 апреля 2020

Мы можем поднастроить строки, используя 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
...