Вы можете определить в векторе recode
, какие переменные нужно изменить, и lapply
над ним с помощью ifelse
, в котором вы выполняете некоторую арифметику.
Предположим, этот кадр данных
head(df1)
# ir01 ir02 dont.change.me
# 1 1 4 1
# 2 8 8 2
# 3 1 8 3
# 4 1 8 4
# 5 2 4 5
# 6 4 2 6
Определить recode
вектор,
recode <- c("ir01", "ir02")
и lapply
для определенных столбцов внутри:
df1[recode] <- lapply(df1[recode], function(x) ifelse(x %in% 8:9, NA, abs(x - 5)))
head(df1)
# ir01 ir02 dont.change.me
# 1 4 1 1
# 2 NA NA 2
# 3 4 NA 3
# 4 4 NA 4
# 5 3 1 5
# 6 1 3 6
Взгляды перевернуты, только те, которые должны!
Факторы?
Иногда эти парни factors
,
df1$ir01 <- lapply(df1$ir01, as.factor) # intentionally change `ir01` into factor
str(df1)
# 'data.frame': 20 obs. of 3 variables:
# $ ir01 : Factor w/ 6 levels "1","2","3","4",..: 1 5 1 1 2 4 2 2 1 4 ...
# $ ir02 : int 4 8 8 8 4 2 4 3 2 1 ...
# $ dont.change.me: int 1 2 3 4 5 6 7 8 9 10 ...
, и мы могли бы расширить нашу функцию, чтобы сделать их:
df1[recode] <- lapply(df1[recode],
function(x) {
if (is.factor(x))
x <- as.numeric(levels(x))[x]
ifelse(x %in% 8:9, NA, abs(x - 5))
})
head(df1)
# ir01 ir02 dont.change.me
# 1 4 1 1
# 2 NA NA 2
# 3 4 NA 3
# 4 4 NA 4
# 5 3 1 5
# 6 1 3 6
Данные
df1 <- structure(list(ir01 = c(1L, 8L, 1L, 1L, 2L, 4L, 2L, 2L, 1L, 4L,
1L, 8L, 9L, 4L, 2L, 2L, 3L, 1L, 1L, 3L),
ir02 = c(4L, 8L, 8L, 8L, 4L, 2L, 4L, 3L, 2L, 1L,
2L, 9L, 3L, 9L, 2L, 4L, 4L, 9L, 2L, 8L),
dont.change.me = 1:20), class = "data.frame",
row.names = c(NA, -20L))