如何为一个数据帧的子集重新编码多个变量?

时间:2019-12-18 14:11:38

标签: r dataframe recode

我迷路了,所以任何指示都将对您有所帮助。假设我有一个数据框:

df <- data.frame(
  id = 1:12,
  v1 = rep(c(1:4), 3),
  v2 = rep(c(1:3), 4),
  v3 = rep(c(1:6), 2),
  v4 = rep(c(1:2), 6))

我的目标是为变量v3和v4重新编码2 = 4和4 = 2,但仅对前4种情况(id <5)进行重新编码。我正在寻找适用于多达二十个变量的解决方案。我知道如何进行基本的编码,但是在处理多个变量时我看不到一种实现子集条件的简单方法。

4 个答案:

答案 0 :(得分:3)

您可以在mutate_at的{​​{1}}中尝试case_when

dplyr

使用library(dplyr) df %>% mutate_at(vars(v3:v4), ~case_when(id < 5 & . == 4 ~ 2L, id < 5 & . == 2 ~ 4L, TRUE ~.)) # id v1 v2 v3 v4 #1 1 1 1 1 1 #2 2 2 2 4 4 #3 3 3 3 3 1 #4 4 4 1 2 4 #5 5 1 2 5 1 #6 6 2 3 6 2 #7 7 3 1 1 1 #8 8 4 2 2 2 #9 9 1 3 3 1 #10 10 2 1 4 2 #11 11 3 2 5 1 #12 12 4 3 6 2 ,您可以指定要应用该功能的列范围。

答案 1 :(得分:3)

这是基本的R解决方案,

df[1:5, c('v3', 'v4')] <- lapply(df[1:5, c('v3', 'v4')], function(i) 
                                       ifelse(i == 2, 4, ifelse(i == 4, 2, i)))

给出,

   id v1 v2 v3 v4
1   1  1  1  1  1
2   2  2  2  4  4
3   3  3  3  3  1
4   4  4  1  2  4
5   5  1  2  5  1
6   6  2  3  6  2
7   7  3  1  1  1
8   8  4  2  2  2
9   9  1  3  3  1
10 10  2  1  4  2
11 11  3  2  5  1
12 12  4  3  6  2

答案 2 :(得分:3)

另一个更直接的选择是获取要替换的数字的索引,并用6减去数字(6-4 = 2、6-2 = 4)替换它们:

whToChange <- which(df[1:5, c("v3", "v4")] ==2 | df[1:5, c("v3", "v4")]==4, arr.ind=TRUE)

df[, c("v3", "v4")][whToChange] <- 6-df[, c("v3", "v4")][whToChange]

head(df, 5)
#  id v1 v2 v3 v4
#1  1  1  1  1  1
#2  2  2  2  4  4
#3  3  3  3  3  1
#4  4  4  1  2  4
#5  5  1  2  5  1

答案 3 :(得分:1)

您可以使用n和一个查找表-只是为了追赶,您必须减少两个以上的值。

n

还可以查看R: How to recode multiple variables at onceRecoding multiple variables in R