Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何为数据帧的子集重新编码多个变量?_R_Dataframe_Recode - Fatal编程技术网

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

R 如何为数据帧的子集重新编码多个变量?,r,dataframe,recode,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)) df在dplyr library(dplyr) df %>% mutate_at(vars(v3:v4), ~case_when(id < 5 & . == 4 ~

我迷路了,所以任何方向都会有帮助。假设我有一个数据帧:

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))

df在
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
库(dplyr)
df%>%
当(id<5&.==4~2L)时,在(vars(v3:v4)处变异~case_,
id<5&==2~4L,
对~))
#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

使用
mutate_at
可以指定要应用函数的列范围

这是一个基本的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)))

您可以使用
match
和查找表-仅在chase中,您必须后退两个以上的值

rosetta <- matrix(c(2,4,4,2), 2)
df[1:4, c("v3", "v4")] <- lapply(df[1:4, c("v3", "v4")], function(x) {
  i <- match(x, rosetta[1,]); j <- !is.na(i); "[<-"(x, j, rosetta[2, i[j]])})
df
#   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

rosetta另一个更直接的选项是获取要替换的数字的索引,并将其替换为6减去数字(6-4=2,6-2=4):


whToChange好的,谢谢!这看起来是个不错的解决方案。我不太明白的是这里“~”和“.”的用法,所以我不太明白“TRUE~”在结尾的作用。点排序的工作方式类似于通过变量的循环?@2freet
TRUE~。
结尾处指的是列不是4或2的所有情况,因此在这种情况下,它保持相同的值
~
是一种公式式语法,您可以在
?case\u when
上阅读更多有关它的信息。谢谢。我认为了解解决方案的基本R版本非常有用!或者
df[1:5,c('v3','v4')][df[1:5,c('v3','v4')]==2 | df[1:5,c('v3','v4')]==4]@Cath你应该把它放在一个新的答案中!
rosetta <- matrix(c(2,4,4,2), 2)
df[1:4, c("v3", "v4")] <- lapply(df[1:4, c("v3", "v4")], function(x) {
  i <- match(x, rosetta[1,]); j <- !is.na(i); "[<-"(x, j, rosetta[2, i[j]])})
df
#   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
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