我有一个李克特比例的巨大数据框,值在 1 到 5 之间。但是我想更改一些数值来反转比例,但手动需要很多时间。问题是:有更简单的方法来更改值?
我认为一个例子效果更好,所以这是我现在拥有的数据框。对于每个问题,答案都有一个数字表示。
Q1 <- c(1,3,5,2,4)
Q2 <- c(5,3,1,2,4)
Q3 <- c(1,1,1,5,5)
my.df <- data.frame(Q1,Q2,Q3)
print(my.df)
我需要的数据框具有保存在数据库中的相反值。
Q1 <- c(5,3,1,4,2)
Q2 <- c(1,3,5,4,2)
Q3 <- c(5,5,5,1,1)
my.df2 <- data.frame(Q1,Q2,Q3)
print(my.df2)
也许这是一个简单的问题,但我尝试了一些 apply family 函数,它们返回一个列表,我尝试的所有循环都返回错误,所以我无法弄清楚如何进行我需要的更改。
这是一个非常简单的方法:
6 - my.df
Q1 Q2 Q3
1 5 1 5
2 3 3 5
3 1 5 5
4 4 4 1
5 2 2 1
为什么有效:my.df
仅包含数值数据和算术运算,R
被矢量化。6 - my.df
从6
中减去my.df
中的每个值。因为my.df
是data.frame
,所以输出也是。
这可能很有用。您可以使用新值创建keys
数据并重塑数据,以便合并和添加新值:
library(dplyr)
library(tidyr)
#Keys
keys <- data.frame(value=1:5,new=5:1)
#Merge
new <- my.df %>%
mutate(id=row_number()) %>%
pivot_longer(-id) %>%
left_join(keys) %>%
select(-value) %>%
pivot_wider(names_from = name,values_from=new) %>%
select(-id)
输出:
# A tibble: 5 x 3
Q1 Q2 Q3
<int> <int> <int>
1 5 1 5
2 3 3 5
3 1 5 5
4 4 4 1
5 2 2 1