如何解决根据其他两列中的值创建是/否列
我有一个如下所示的数据集:
df <- structure(list(ID = 1:10,Region1 = c("Europe","NA","Asia","Europe","Africa","North America"),Region2 = c("NA","NA"
)),class = "data.frame",row.names = c(NA,-10L))
我想创建一个名为 EuropeYN
的新列,根据区域列(region1
或 region2
)中的 EITHER 是否包含“欧洲”,该列是是或否。最终数据应如下所示:
df <- structure(list(ID = 1:10,"NA"
),EuropeYN = c("yes","yes","no","no")),-10L))
如果只是检查“欧洲”是否出现在一列中,我知道如何执行此操作,但不知道在跨多列检查时如何执行此操作。如果只有一列,我会这样做:
df$EuropeYN <- ifelse(grepl("Europe",df$region1),"no")
关于解决这个问题的最佳方法有什么想法吗?...
解决方法
有点晚了,但也许仍然值得一看:
library(dplyr)
library(stringr)
df %>%
rowwise() %>%
mutate(YN = +any(str_detect(c_across(Region1:Region2),'Europe')))
# A tibble: 10 x 4
# Rowwise:
ID Region1 Region2 YN
<int> <chr> <chr> <int>
1 1 Europe NA 1
2 2 NA Europe 1
3 3 Asia NA 0
4 4 NA NA 0
5 5 Europe NA 1
6 6 NA Europe 1
7 7 Africa NA 0
8 8 NA NA 0
9 9 Europe NA 1
10 10 North America NA 0
或者,没有+
:
df %>%
rowwise() %>%
mutate(YN = any(str_detect(c_across(Region1:Region2),'Europe')))
# A tibble: 10 x 4
# Rowwise:
ID Region1 Region2 YN
<int> <chr> <chr> <lgl>
1 1 Europe NA TRUE
2 2 NA Europe TRUE
3 3 Asia NA FALSE
4 4 NA NA FALSE
5 5 Europe NA TRUE
6 6 NA Europe TRUE
7 7 Africa NA FALSE
8 8 NA NA FALSE
9 9 Europe NA TRUE
10 10 North America NA FALSE
如果您有多个要mutate
的列,您可以使用 starts_with
(或 contains
或 ends_with
)来处理这些列:
df %>%
rowwise() %>%
mutate(YN = any(str_detect(c_across(starts_with('R')),'Europe')))
,
我的方法与您的非常相似:
dplyr::mutate(df,EuropeYN = ifelse((Region1 == "Europe" | Region2 == "Europe"),"yes","no"))
,
两种方式:
-
逐字检查两列:
ifelse(df$Region1 == "Europe" | df$Region2 == "Europe","no") # [1] "yes" "yes" "no" "no" "yes" "yes" "no" "no" "yes" "no"
这样做的优点是更容易阅读(主观)且非常清晰。
-
选择范围的列并寻找相等性:
subset(df,select = Region1:Region2) == "Europe" # Region1 Region2 # 1 TRUE FALSE # 2 FALSE TRUE # 3 FALSE FALSE # 4 FALSE FALSE # 5 TRUE FALSE # 6 FALSE TRUE # 7 FALSE FALSE # 8 FALSE FALSE # 9 TRUE FALSE # 10 FALSE FALSE apply(subset(df,select = Region1:Region2) == "Europe",1,any) # 1 2 3 4 5 6 7 8 9 10 # TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE
这允许我们使用 1 个或多个列。
其中任何一个都可以通过 df$EuropeYN <- ...
重新分配到框架中。
这是一个矢量化的基本 R 方法。
i <- rowSums(df[grep("Region",names(df))] == "Europe") > 0
df$EuropeYN <- c("no","yes")[i + 1L]
,
我们可以在这里使用 if_any
作为 tidyverse
中的矢量化选项
library(dplyr)
library(stringr)
df %>%
mutate(YN = if_any(starts_with("Region"),str_detect,'Europe'))
ID Region1 Region2 YN
1 1 Europe NA TRUE
2 2 NA Europe TRUE
3 3 Asia NA FALSE
4 4 NA NA FALSE
5 5 Europe NA TRUE
6 6 NA Europe TRUE
7 7 Africa NA FALSE
8 8 NA NA FALSE
9 9 Europe NA TRUE
10 10 North America NA FALSE
或在base R
df$YN <- Reduce(`|`,lapply(df[startsWith(names(df),'Region')],`%in%`,'Europe'))
注意:使用逻辑标志而不是 "Yes"/"No"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。