更改许多r变量中的值

时间:2018-02-11 20:48:24

标签: r

对于我的数据集中的许多不同变量,我想做相当于find和replace 1 = 0; 2 = 0; 3 = 0; 4 = 1; 5 = 2; 6 = 3。

我尝试过的事情: 使1 = 0; 2 = 0; 3 = 0; 4 = 1; 5 = 2; 6 = 3进入函数并使用sapply。我改变了; to,并将=更改为< - 并且没有将这些组合识别为函数。我尝试使用该定义创建一个函数并将其置于sapply中并且它不起作用。 我尝试使用重新编码,它不起作用:

wdata[ ,cols2] = recode(wdata[ ,cols2], 1=0;2=0;3=0;4=1;5=2;6=3)

3 个答案:

答案 0 :(得分:1)

假设您正在使用data.framematrix,则可以使用直接索引:

# Sample data
set.seed(2017);
df <- as.data.frame(matrix(sample(1:6, 20, replace = T), ncol = 4));
df;
#V1 V2 V3 V4
#1  6  5  5  3
#2  4  1  1  3
#3  3  3  1  5
#4  2  3  3  6
#5  5  2  3  5

df[df == 1 | df == 2 | df == 3] <- 0;
df[df == 4] <- 1;
df[df == 5] <- 2;
df[df == 6] <- 3;
df;
#  V1 V2 V3 V4
#1  3  2  2  0
#2  1  0  0  0
#3  0  0  0  2
#4  0  0  0  3
#5  2  0  0  2

请注意,替换的顺序很重要。例如,df[df == 4] = 1; df[df == 1] <- 0;将提供df[df == 1] <- 0; df[df == 4] <- 1;

的不同输出

答案 1 :(得分:1)

recode dplyrsapplymutate_all使用set.seed(2017); df <- as.data.frame(matrix(sample(1:6, 20, replace = T), ncol = 4)); df library(dplyr) f = function(x) recode(x, `1`=0, `2`=0, `3`=0, `4`=1, `5`=2, `6`=3) sapply(df, f) # V1 V2 V3 V4 # [1,] 3 2 2 0 # [2,] 1 0 0 0 # [3,] 0 0 0 2 # [4,] 0 0 0 3 # [5,] 2 0 0 2 df %>% mutate_all(f) # V1 V2 V3 V4 # 1 3 2 2 0 # 2 1 0 0 0 # 3 0 0 0 2 # 4 0 0 0 3 # 5 2 0 0 2 的替代解决方案:

Promise.all()

答案 2 :(得分:1)

lapplymatch的循环备选方案如下:

dat[] <- lapply(dat, function(x) c(0, 0, 0, 1, 2, 3)[match(x, 1:6)])

这使用向量c(0,0,0,1,2,3)上的查找表,match选择索引。使用Maurits Evers创建的data.frame,我们得到

dat
  V1 V2 V3 V4
1  3  2  2  0
2  1  0  0  0
3  0  0  0  2
4  0  0  0  3
5  2  0  0  2

要对列的子集执行此操作,只需在每一侧选择它们,例如

dat[, cols2] <-
   lapply(dat[, cols2], function(x) c(0, 0, 0, 1, 2, 3)[match(x, 1:6)])

dat[cols2] <- lapply(dat[cols2], function(x) c(0, 0, 0, 1, 2, 3)[match(x, 1:6)])