R 重命名数据帧中多个特定因子中的级别

R 重命名数据帧中多个特定因子中的级别,r,dataframe,R,Dataframe,我有数据帧DF: DF <- data.frame(V1 = factor(c("Yes", "No", "Yes", "No", "No")), V2 = factor(c("Yes", "No", "No", "Yes", "No")), Location = factor(c("London", "Paris", "No", "Dallas", "No")), V3 = factor

我有数据帧
DF

DF <- data.frame(V1 = factor(c("Yes", "No", "Yes", "No", "No")),
                 V2 = factor(c("Yes", "No", "No", "Yes", "No")),
                 Location = factor(c("London", "Paris", "No", "Dallas", "No")),
                 V3 = factor(c("No", "Yes", "No", "No", "No")),
                 V4 = factor(c("No", "Yes", "No", "No", "No")))

是否有方法根据变量在数据集中的位置(此处为第1:2列和第4:5列)指定重命名适用的变量?

也许有人可以建议一个更优雅的解决方案,但是一个有效的解决方案(无需手动更改每个变量)如下所示:

change.vec = c("V1", "V2", "V3", "V4")

for(i in 1:length(change.vec)) {
    levels(DF[,change.vec[i]]) = c("X", "Yes")  
}

>DF
 V1  V2 Location  V3  V4
 1 Yes Yes   London   X   X
 2   X   X    Paris Yes Yes
 3 Yes   X       No   X   X
 4   X Yes   Dallas   X   X
 5   X   X       No   X   X

只需指定要对其应用
重估值
功能的列号:

cols_to_update <- c(1:2,4:5)
DF[, cols_to_update] <- lapply(DF[,cols_to_update], function(x) plyr::revalue(x, c("No"="X")))

cols\u to\u update您也可以使用tidyverse方法执行此操作:

库(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
图书馆(plyr)
#> -------------------------------------------------------------------------
#>您已在dplyr之后加载plyr-这可能会导致问题。
#>如果您需要plyr和dplyr的功能,请先加载plyr,然后加载dplyr:
#>图书馆(plyr);图书馆(dplyr)
#> -------------------------------------------------------------------------
#> 
#>附上包裹:“plyr”
#>以下对象已从“package:dplyr”屏蔽:
#> 
#>排列、计数、描述、失效、标识、变异、重命名、总结,
#>总结
测向V1 V2位置V3 V4
#>1是的是的伦敦X X
#>2 X巴黎是的是的
#>3是X否X
#>4 X是达拉斯X X
#>5 X No X

由(v0.2.1)

另一个使用dplyrs
~fun(.)
作为
.funs
参数并结合::fct\u recode:

库(“dplyr”)
图书馆(“forcats”)
(DF%)
在(变量(-Location),~fct_重新编码(,“X”=“No”))处进行变异
#V1 V2位置V3 V4
#1是的是的伦敦X X
#2 X巴黎是的是的
#3是X否X
#4 X是达拉斯X X
#5 X No X
dplyr 1.0的更新:

新的
cross()
取代了
mutate\u at
等“范围变量”系列。
cross()
可以轻松地对多个列应用相同的转换,允许您在summary()和mutate()中使用select()语义

适用于此处的问题,以下是实现此目的的两种变体:

DF %>%
  mutate(across((!Location), ~fct_recode(., "X" = "No")))

DF %>%
  mutate(across(c(1:2,4:5), ~fct_recode(., "X" = "No")))

请注意:
data.frame
默认情况下会将字符串转换为因子,因此示例中的
factor()
部分是多余的。
DF %>%
  mutate(across((!Location), ~fct_recode(., "X" = "No")))

DF %>%
  mutate(across(c(1:2,4:5), ~fct_recode(., "X" = "No")))