【问题标题】:R - Subtract the same value from multiple columnsR - 从多列中减去相同的值
【发布时间】:2020-12-07 13:06:35
【问题描述】:

我有一组使用李克特量表响应的调查数据,编码为 1-5(“非常不同意”到“非常同意”)。我正在尝试将分数重新集中在 0 附近,这样 -2 表示“非常不同意”,+2 表示“非常同意”。

到达那里的一个明显方法是将所有列减去 3,但我不知道在一行代码中从多列中减去相同的数字,我相信有一种方法......

示例数据:

likert_data <- data.frame(id=c(1:10),
                          a=sample(x = 1:5, size = 10,replace=T),
                          b=sample(x = 1:5, size = 10,replace=T),
                          c=sample(x = 1:5, size = 10,replace=T)
                          )

我当然可以做这样的事情......

likert_data %<>% 
  mutate(across(c(a:c), ~case_when(. == 1 ~ as.numeric(-2),
                                   . == 2 ~ as.numeric(-1),
                                   . == 3 ~ as.numeric(0),
                                   . == 4 ~ as.numeric(1),
                                   . == 5 ~ as.numeric(2))))

...不过我觉得不是很优雅。

有没有办法将列 a:c 减去 3?不必使用dplyr,但如果存在dplyr 解决方案,我将不胜感激! :)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    由于 R 是矢量化的,只需从列中减去 3:

    cars <- mtcars
    cars[1:3] <- cars[1:3] - 3
    cars
                         mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4           18.0   3 157.0 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag       18.0   3 157.0 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710          19.8   1 105.0  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive      18.4   3 255.0 110 3.08 3.215 19.44  1  0    3    1
    Hornet Sportabout   15.7   5 357.0 175 3.15 3.440 17.02  0  0    3    2
    Valiant             15.1   3 222.0 105 2.76 3.460 20.22  1  0    3    1
    Duster 360          11.3   5 357.0 245 3.21 3.570 15.84  0  0    3    4
          
    

    【讨论】:

    • 对于操作的数据likert_data[c("a", "b", "c")] &lt;- likert_data[c("a", "b", "c")] - 3
    【解决方案2】:

    也许用across()试试这个:

    library(dplyr)
    #Data
    new <- likert_data <- data.frame(id=c(1:10),
                              a=sample(x = 1:5, size = 10,replace=T),
                              b=sample(x = 1:5, size = 10,replace=T),
                              c=sample(x = 1:5, size = 10,replace=T)
    )
    #Code
    new <- likert_data %>% mutate(across(a:c,~.-3))
    

    输出:

       id  a  b  c
    1   1  2 -2  1
    2   2  2 -2  0
    3   3 -2 -1 -2
    4   4  0  0 -1
    5   5  2 -2  2
    6   6  1  2  2
    7   7  0  0  1
    8   8  0  1 -2
    9   9  0 -1 -1
    10 10  2  0 -2
    

    【讨论】:

      【解决方案3】:

      我会使用data.table,尤其是当您的数据很大时。

      library(dplyr)
      library(data.table)    
      likert_data <- data.frame(id=c(1:10),
                                a=sample(x = 1:5, size = 10,replace=T),
                                b=sample(x = 1:5, size = 10,replace=T),
                                c=sample(x = 1:5, size = 10,replace=T)
      ) %>% data.table()
      
      cols <- c("a", "b", "c")
      
      likert_data[, (cols) := lapply(.SD, function(x) (x-3)), .SDcols = cols]
      

      如果要创建其他列来存储新值:

      newcols <- c("a-3", "b-3", "c-3")
      likert_data[, (newcols) := lapply(.SD, function(x) (x-3)), .SDcols = cols]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多