Как заменить несколько значений между несколькими столбцами в R-данных? - PullRequest
0 голосов
/ 27 февраля 2019

Скажем, у меня есть следующий фрейм данных (реальный - 10 столбцов labelx):

id <- c(1,2,3,4,5,6,7,8)
label1 <- c("apple","shoe","banana","hat","dog","radio","tree","pie")
label2 <- c("apple","sneaker","fruit","beanie","pet","ipod","doug fir","pie")
df <- data.frame(id,label1,label2)

И я хотел бы заменить все элементы в столбцах меток словом, которое его классифицирует.

food <- c("apple","banana","pie","fruit")
clothing <- c("shoe","hat","beanie")
entertainment <- c("radio","ipod","mp3 player","phone")
forest <- c("tree","doug fir","redwood","forest")

Я пробовал что-то вроде следующего:

column_list <- c("label1","label2")
new_df <- df

for(i in 1:2) {
  new_df <- new_df %>%
  mutate(parse(text=column_list[i-1]) = replace(parse(text=column_list[i-1]),
                      (parse(text=column_list[i-1]) %in% food),
                      "food"))
}

Мне не нужно делать это так, проще тоже хорошо.Tidyverse предпочтительнее.Как заменить несколько значений между несколькими столбцами в R-кадре данных?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вот подход, использующий базу R. Идея состоит в том, чтобы создать именованный вектор, в котором имена - это отдельные вещи (apple, shoe и т. Д.), А значения - категории (food, clothing, так далее.).Тогда это вопрос извлечения категорий непосредственно с помощью имен.

obj = c("food", "clothing", "entertainment", "forest")
mylist = mget(obj)
mylist = lapply(obj, function(x){
    temp = mylist[[x]]
    setNames(rep(x, length(temp)), temp)
})
mylist = unlist(mylist)

df[-1] = lapply(df[-1], function(x) as.vector(mylist[as.character(x)]))
df
#  id        label1        label2
#1  1          food          food
#2  2      clothing          <NA>
#3  3          food          food
#4  4      clothing      clothing
#5  5          <NA>          <NA>
#6  6 entertainment entertainment
#7  7        forest        forest
#8  8          food          food
0 голосов
/ 27 февраля 2019

Если у вас есть все метки в одном списке, вы можете использовать dplyr::recode.

library("dplyr")

labels <- list()

for (x in food)          { labels[x] = "food" }
for (x in clothing)      { labels[x] = "clothing" }
for (x in entertainment) { labels[x] = "entertainment" }
for (x in forest)        { labels[x] = "forest" }

df %>%
  mutate_at(vars(label1, label2), recode, !!!labels)
0 голосов
/ 27 февраля 2019

Одной из возможностей может быть использование mutate_at(), а затем вложенный ifelse():

df %>%
 mutate_at(vars(contains("label")), 
           funs(ifelse(. %in% food, "food", 
                       ifelse(. %in% clothing, "clothing",
                              ifelse(. %in% entertainment, "entertainment",
                                     ifelse(. %in% forest, "forest", NA_character_))))))


  id        label1        label2
1  1          food          food
2  2      clothing          <NA>
3  3          food          food
4  4      clothing      clothing
5  5          <NA>          <NA>
6  6 entertainment entertainment
7  7        forest        forest
8  8          food          food

С mutate_at() он выбирает переменные, которые имеют «метку» в своем имени, а затем просто применяетвложенный ifelse() с учетом условий.

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