我想在R中一次重新编码多个变量。变量位于更大的数据帧中。以下是一些示例数据:
z <- data.frame (A = c(1,2,300,444,555),
B = c(555,444,300,2,1),
C = c(1,2,300,444,555),
D = c(1,2,300,444,555))
我想要做的是将所有等于300的值重新编码为3,444作为4,将555作为5。
我以为我可以在列表中这样做。这是我试过的:
example_list = list(c("A", "B", "C", "D"))
example_list <- apply(z[,example_list], 1, function(x) ifelse(any(x==555, na.rm=F), 0.5,
ifelse(any(x==444), 0.25),
ifelse(any(x==300), 3, example_list)))
我收到此错误:
Error during wrapup: invalid subscript type 'list'
然后尝试使用&#34; lapply&#34;我收到了这个错误:
Error during wrapup: '1' is not a function, character or symbol
即便如此,我也不确定这是做这件事的最佳方式......我只想避免对多个变量逐行进行此操作。任何建议都会令人惊讶,因为我是R的新手,并且完全不了解我做错了什么。
我确实在SO Question上找到了类似的问题,但我不确定如何将其应用于我的具体问题。
答案 0 :(得分:1)
这看起来有点笨重,但确实有效:
{{1}}
答案 1 :(得分:1)
使用case_when
:
library(dplyr)
z %>% mutate_all(
function(x) case_when(
x == 300 ~ 3,
x == 444 ~ 4,
x == 555 ~ 5,
TRUE ~ x
)
)
A B C D
1 1 5 1 1
2 2 4 2 2
3 3 3 3 3
4 4 2 4 4
5 5 1 5 5
答案 2 :(得分:0)
z = data.frame (A = c(1,2,300,444,555),
B = c(555,444,300,2,1),
C = c(1,2,300,444,555),
D = c(1,2,300,444,555))
library(expss)
to_recode = c("A", "B", "C", "D")
recode(z[, to_recode]) = c(300 ~ 3, 444 ~ 4, 555 ~ 5)
答案 3 :(得分:0)
这应该有用。
library(plyr)
new.z<- apply(z, 1, function(x) mapvalues(x, from = c(300, 444, 555), to = c(3, 4, 5)))
答案 4 :(得分:0)
如果您确实有因子变量并且还想要因子变量作为结果,则可以使用以下代码:
library(tidyverse)
z <- data.frame (A = factor(c(1,2,300,444,555)),
B = factor(c(555,444,300,2,1)),
C = factor(c(1,2,300,444,555)),
D = factor(c(1,2,300,444,555)))
new.z <- z %>%
mutate_all(function(x) recode_factor(x, "300" = "3", "444" = "4", "555" = "5"))