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

3lxsmp7m  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(127)

我有一个如下所示的嵌套框架,这段代码的输出如下所示。

  • 本质上,我想从列中读取值,这些列可以是两种格式,如col1和col2所示。
  • 如果格式与col1相同,那么我们拆分文本并读取第三个元素,如果格式与col2相同,那么我们读取单元格的值。
  • 然后,我们希望传递条件,如果列中的值(拆分col1后的col1和col3)创建col4和col5。
  • 最后,我们需要col6中的结果。
  • 变量“selection”是一个数字列表

问题:由于在原始的嵌套框架中,可以有多个值格式类型的列,如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    NOTSELECT,SELECT
3 xyz_1_104  106 NOTSELECT,NOTSELECT
s8vozzvw

s8vozzvw1#

您可以通过将两个ifelse语句粘贴在一起来一次性完成所有这些操作。col2ifelse很简单。用于col3ifelse使用grepl搜索select中的任何数字,方法是使用paste(..., collapse = "|") (pasting the "or" operator between them). The outer paste(...,sep =“,”)`创建一个搜索字符串,将所有数字放在一起:

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

或者更安全地将单词边界添加到第二个ifelse(感谢@r2evans!)

df$col6 <- paste(ifelse(df$col2 %in% selection, "SELECT", "NOTSELECT"),
                 ifelse(grepl(
                   paste0("(^|_)(", paste(selection, collapse = "|"), ")(_|$)\\b"), 
                   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
dced5bon

dced5bon2#

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

相关问题