对于我的数据集中的许多不同变量,我想做相当于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)
答案 0 :(得分:1)
假设您正在使用data.frame
或matrix
,则可以使用直接索引:
# 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
dplyr
与sapply
或mutate_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)
lapply
和match
的循环备选方案如下:
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)])