繁体   English   中英

在一个条件下仅改变数据子集的值,同时保留所有数据行

[英]Mutating values for only a subset of the data under a condition, while keeping all data rows

我试图仅在我的参与者数据的子集上对值(即 1 到 5、5 到 1 等)进行反向重新编码,同时保留所有行:对于那些表示母语为英语的人。 由于我的数据集非常大,我想避免将其分成 2 个数据集(第一语言是英语的人,以及其他第一语言的人),然后尝试通过参与者 ID 将结果复制粘贴回 dataframe。

这是一个小例子来说明它:

data1 <- data.frame(primary_school=c(1,2,1,3,4,5,2,1,2,1,3,1,3,3,1,1,4,2,5,1), high_school=c(1,2,3,4,5,1,2,1,1,3,1,3,1,2,3,3,4,2,1,2), relatives=c(1,2,3,4,5,5,2,5,5,3,1,3,5,2,3,3,4,2,1,5),home=c(3,2,3,3,4,5,3,3,2,1,3,1,3,3,3,1,3,2,3,3), siblings=c(1,1,1,4,1,1,2,1,1,3,1,1,1,1,1,1,4,2,1,1), Language_A=c("English","English","English","Tamil","French","Malay","Romanian","English","Quechua","Zapotec", "English","English","English","Tamil","French","Malay","Romanian","English","Quechua","Zapotec"),L1=c("English","English","English","Tamil","French","English","English","English","Quechua","Zapotec","English","English","English","Tamil","French","Malay","Romanian","English","Quechua","Zapotec"))

> data1
   primary_school high_school relatives home siblings Language_A       L1
1               1           1         1    3        1    English  English
2               2           2         2    2        1    English  English
3               1           3         3    3        1    English  English
4               3           4         4    3        4      Tamil    Tamil
5               4           5         5    4        1     French   French
6               5           1         5    5        1      Malay  English
7               2           2         2    3        2   Romanian  English
8               1           1         5    3        1    English  English
9               2           1         5    2        1    Quechua  Quechua
10              1           3         3    1        3    Zapotec  Zapotec
11              3           1         1    3        1    English  English
12              1           3         3    1        1    English  English
13              3           1         5    3        1    English  English
14              3           2         2    3        1      Tamil    Tamil
15              1           3         3    3        1     French   French
16              1           3         3    1        1      Malay    Malay
17              4           4         4    3        4   Romanian Romanian
18              2           2         2    2        2    English  English
19              5           1         1    3        1    Quechua  Quechua
20              1           2         5    3        1    Zapotec  Zapotec

我第一次尝试的是使用filter ,但很快发现它只是从数据集中拆分 L1 是英语的人的样本(因此满足(!(Language_A =="English" | L1 == "English") ),虽然我想保留所有行:

testtest<- data1 %>%
  filter(!(Language_A =="English" | L1 == "English")) %>% 
  mutate_at(c("primary_school","high_school", "siblings","relatives","home"), 
           funs(recode(., "1"=5,"2"=4, "3"=3, "4"=2, "5"=1)))

是否有任何 function 工作类似但保留所有数据?

我也尝试了类似下面的方法,但似乎对我想使用的 arguments 不满意。

testtest<- data1 %>%
  if (Language_A !="English" | L1 != "English"){ 
  mutate_at(c("primary_school","high_school", "siblings","relatives","home"), 
           funs(recode(., "1"=5,"2"=4, "3"=3, "4"=2, "5"=1)))
  } else ()

我看到人们使用case_when解决了类似的问题,但它似乎主要应用于在不同情况下将单个值变为另一个单个值。 因此,我不确定如何将其应用于在单个案例下改变多个值。

任何想法将不胜感激。 谢谢!

我们可以使用cross(不推荐使用across _at/_all以支持cross)来遍历那些需要重新编码across列。 然后,基于逻辑即。 只要 Language_A 和 L1 都不是“英语”,请从 6 中减去值(6-1 = 5、6-2= 4、6-3 = 3、6-4 = 2、6-5 = 1 - 仅假设值1-5 之内的列中的每一列),否则返回列值

library(dplyr)
data1 %>% 
  mutate(across(primary_school:siblings, 
  ~ case_when(!(Language_A =="English" | L1 == "English") ~ 6 - .x, TRUE ~ .x)))

-输出

primary_school high_school relatives home siblings Language_A       L1
1               1           1         1    3        1    English  English
2               2           2         2    2        1    English  English
3               1           3         3    3        1    English  English
4               3           2         2    3        2      Tamil    Tamil
5               2           1         1    2        5     French   French
6               5           1         5    5        1      Malay  English
7               2           2         2    3        2   Romanian  English
8               1           1         5    3        1    English  English
9               4           5         1    4        5    Quechua  Quechua
10              5           3         3    5        3    Zapotec  Zapotec
11              3           1         1    3        1    English  English
12              1           3         3    1        1    English  English
13              3           1         5    3        1    English  English
14              3           4         4    3        5      Tamil    Tamil
15              5           3         3    3        5     French   French
16              5           3         3    5        5      Malay    Malay
17              2           2         2    3        2   Romanian Romanian
18              2           2         2    2        2    English  English
19              1           5         5    3        5    Quechua  Quechua
20              5           4         1    3        5    Zapotec  Zapotec

这是使用ifelse的类似 dplyr 解决方案:

library(dplyr)
data1 %>% 
  mutate(across(-c(Language_A, L1), ~ifelse(Language_A=="English" | 
                                              L1 == "English", ., 6-.)))
 primary_school high_school relatives home siblings Language_A       L1
1               1           1         1    3        1    English  English
2               2           2         2    2        1    English  English
3               1           3         3    3        1    English  English
4               3           2         2    3        2      Tamil    Tamil
5               2           1         1    2        5     French   French
6               5           1         5    5        1      Malay  English
7               2           2         2    3        2   Romanian  English
8               1           1         5    3        1    English  English
9               4           5         1    4        5    Quechua  Quechua
10              5           3         3    5        3    Zapotec  Zapotec
11              3           1         1    3        1    English  English
12              1           3         3    1        1    English  English
13              3           1         5    3        1    English  English
14              3           4         4    3        5      Tamil    Tamil
15              5           3         3    3        5     French   French
16              5           3         3    5        5      Malay    Malay
17              2           2         2    3        2   Romanian Romanian
18              2           2         2    2        2    English  English
19              1           5         5    3        5    Quechua  Quechua
20              5           4         1    3        5    Zapotec  Zapotec

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM