![](/img/trans.png)
[英]R - subset data frame keeping only the rows that agree with multiple conditions over ALL columns
[英]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.