在 R 中的多列中应用 strsplit 和 ifelse 条件

问题描述 投票:0回答:2

我有一个如下所示的数据框,该代码的输出如下所示。

  • 本质上,我想从列中读取值,这些值可以有两种格式,如 col1 和 col2 所示。
  • 如果格式与 col1 相同,则我们拆分文本并读取第三个元素,如果格式与 col2 相同,我们按原样读取单元格值。
  • 然后我们想要传递条件 if 列中的值(拆分 col1 后的 col1 和 col3)来创建 col4 和 col5。
  • 最后,我们想要第 6 列中的结果。

问题:由于在原始数据框中,可以有多列值格式类型,如 col1 和 col2 中,如何修改下面的代码以获得所需的输出?

#STEP1

df <- data.frame(
  col1 = c("abc_1_102", "abc_1_103", "xyz_1_104"),
  col2 = c("107", "108", "106")
)

#STEP2

split_text <- strsplit(df$col1, "_")

third_elements <- sapply(split_text, function(x) if(length(x) >= 3) x[3] else NA)

#STEP3

df$col3<-third_elements

#STEP4

selection<-c(107,102,108)

df$col4<-ifelse(df$col2 %in% selection,"SELECT","NOTSELECT")

df$col5<-ifelse(df$col3 %in% selection,"SELECT","NOTSELECT")

#STEP5

df$col6<-paste(df$col4,df$col5,sep = ",")

上述代码的输出:

       col1 col2 col3      col4      col5                col6
1 abc_1_102  107  102    SELECT    SELECT       SELECT,SELECT
2 abc_1_103  108  103    SELECT NOTSELECT    SELECT,NOTSELECT
3 xyz_1_104  106  104 NOTSELECT NOTSELECT NOTSELECT,NOTSELECT

所需输出

       col1 col2                col6
1 abc_1_102  107       SELECT,SELECT
2 abc_1_103  108    SELECT,NOTSELECT
3 xyz_1_104  106 NOTSELECT,NOTSELECT
r dataframe if-statement sapply strsplit
2个回答
0
投票

您可以通过将两个

ifelse
语句粘贴在一起来一次性完成这一切。
ifelse
col2
很简单。
ifelse
col3
使用
grepl
来搜索
select
中的任何数字。
paste(..., sep = ",")
把它们放在一起:

df$col6 <- paste(ifelse(df$col2 %in% selection, "SELECT", "NOTSELECT"),
                 ifelse(grepl(paste(selection, collapse = "|"), df$col1), "SELECT", "NOTSELECT"),
                 sep = ",")

输出:

       col1 col2                col6
1 abc_1_102  107       SELECT,SELECT
2 abc_1_103  108    SELECT,NOTSELECT
3 xyz_1_104  106 NOTSELECT,NOTSELECT

0
投票
df$col6 <- paste(
  ifelse(df$col2 %in% selection, "SELECT", "NOTSELECT"),
  strsplit(df$col1, "_") |>
    sapply(`%in%`, selection) |>
    colSums() |>
    ifelse("SELECT", "NOTSELECT"),
  sep = ",")
#        col1 col2                col6
# 1 abc_1_102  107       SELECT,SELECT
# 2 abc_1_103  108    SELECT,NOTSELECT
# 3 xyz_1_104  106 NOTSELECT,NOTSELECT
© www.soinside.com 2019 - 2024. All rights reserved.