R-从多个列中减去相同的值

R-从多个列中减去相同的值,r,dplyr,R,Dplyr,我有一组使用利克特量表回答的调查数据,编码为1-5“强烈不同意”到“强烈同意”。我试图将分数重新集中在0左右,这样-2表示“强烈不同意”,而+2表示“强烈同意” 一个明显的方法是将所有列减去3,但我不知道如何在一行代码中从多个列中减去相同的数字,我相信有一种方法 示例数据: likert_data <- data.frame(id=c(1:10), a=sample(x = 1:5, size = 10,replace=T),

我有一组使用利克特量表回答的调查数据,编码为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是矢量化的,所以只需从列中减去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
      

因为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
      
我会使用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]
我会使用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]
对于op的数据,如ERT_数据[ca,b,c],对于op的数据,如ERT_数据[ca,b,c]