在R

时间:2017-05-07 20:42:51

标签: r

我想在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上找到了类似的问题,但我不确定如何将其应用于我的具体问题。

5 个答案:

答案 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"))