我有一个如下所示的嵌套框架,这段代码的输出如下所示。
- 本质上,我想从列中读取值,这些列可以是两种格式,如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
2条答案
按热度按时间s8vozzvw1#
您可以通过将两个
ifelse
语句粘贴在一起来一次性完成所有这些操作。col2
的ifelse
很简单。用于col3
的ifelse
使用grepl
搜索select
中的任何数字,方法是使用paste(..., collapse = "|") (pasting the "or" operator between them). The outer
paste(...,sep =“,”)`创建一个搜索字符串,将所有数字放在一起:或者更安全地将单词边界添加到第二个
ifelse
(感谢@r2evans!)在本例中,这两个给予相同的输出:
dced5bon2#