Поиск и замена нескольких предметов в R - PullRequest
3 голосов
/ 30 апреля 2019

Как новичок в R, мне приходится писать все мои операторы поиска и замены по одной строке за раз (см. Код ниже) Можно ли сделать это более кратким способом (т.е. только одной строкой)

YP$gender <- replace(as.character(YP$gender), YP$gender == "Female", "F")   
YP$gender <- replace(as.character(YP$gender), YP$gender == "Male", "M")

Ответы [ 4 ]

2 голосов
/ 30 апреля 2019

Если только две замены используют 'ifelse':

YP$gender <- ifelse(as.character(YP$gender) == "Female", "F", "M") 

Иначе я бы использовал left_join:

# Data
df <- data.frame(value = sample(1:3,10, replace = TRUE),
                 gender = sample(c("male", "female", "x"), 10, prob = c(0.4,0.4,0.2), replace = TRUE))

# Creating replacements
replace <- data.frame(gender = c("male", "female"), gender_short = c("m", "f"))

# Making replacements
library(dplyr)
df <- left_join(df, replace)
df

       value gender gender_short
1      1 female            f
2      2 female            f
3      3      x         <NA>
4      2   male            m
5      3 female            f
6      3      x         <NA>
7      3 female            f
8      1      x         <NA>
9      3   male            m
10     3   male            m
1 голос
/ 30 апреля 2019

Похоже, у вас есть фактор-столбец, поэтому нам просто нужно изменить метки, примерно так:

YP$gender <- factor(YP$gender, labels = c("F", "M"))

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

x <- factor(c("Female", "Male", "Female"))
x
# [1] Female Male   Female
# Levels: Female Male

#Check the levels
levels(x)
# [1] "Female" "Male"  

# relabel
x <- factor(x, labels = c("F", "M"))
# [1] F M F
# Levels: F M
levels(x)
# [1] "F" "M"
1 голос
/ 30 апреля 2019

Зависит от того, сколько у вас целей и замен.Если у вас много, то, вероятно, самый простой способ - это создать файл слияния с двумя столбцами, один с целевым, а другой с заменой на столько строк, сколько уникальных элементов.Если этот файл слияния называется df, тогда код будет выглядеть примерно так:

library(dplyr)
YP <- YP %>%
  merge(df, by = "gender", all.x = T)

Если не так много уникальных экземпляров для замены, вместо использования вложенных операторов ifelse, вы можете использовать case_when с dplyr.Вы можете связать воедино логику, используя трубы %>%

library(dplyr)
YP %>%
  mutate(gender = case_when(
    gender == "Female" ~ "F",
    gender == "Male"   ~ "M,
    TRUE               ~ gender
  ))
1 голос
/ 30 апреля 2019

Вы можете использовать '% in%' для сравнений кратных вместо '=='.

replace(as.character(YP$gender), YP$gender %in% c("Male","Female"), c("M", "F"))   

РЕДАКТИРОВАТЬ: Извините, этот код не будет работать, как я думал.

Но вы можете использовать циклы для ее решения.

YP = c("a","b","b","a","c")

keys = c("a", "b", "c")
rep_value = c("A", "B", "C")

for(index in 1:length(keys) ) {
  sub_key = keys[index]
  sub_rep_value = rep_value[index]

  value_index = which(YP %in% sub_key)
  YP[value_index] = sub_rep_value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...