我有多个列,其中有类似的数据,我有多个单词,我想知道它们是否在其中一个列中. 举个例子:

df = data.frame(ttt1= c("METO","LETO","META","LETA","METO"),
                ttt2=c("LETO","","METO","","LETA"))
df
  ttt1 ttt2
1 METO LETO
2 LETO     
3 META METO
4 LETA     
5 METO LETA

我想从那些以"TTT"开头或包含"TTT"的列中,按如下方式创建列:

df2 <- df %>%
  mutate(cl_m = ifelse(ttt1 %in% c("METO", "META") | ttt2 %in% c("METO", "META"), 1, 0),
         cl_l = ifelse(ttt1 %in% c("LETO", "LETA") | ttt2 %in% c("LETO", "LETA"), 1, 0))
df2
  ttt1 ttt2 cl_m cl_l
1 METO LETO    1    1
2 LETO         0    1
3 META METO    1    0
4 LETA         0    1
5 METO LETA    1    1

我找到了一些基本R https://copyprogramming.com/howto/check-string-in-columns-r-code-example的选项,但这不适用于我想要查找多个单词的事实(我try 了%in%Typeo),以及它不仅以我的模式开头,而且可以包含它(M0_TTT,TTT_M0,等等).

它可以是一个base-R或dummy的解决方案,这不是一个问题

推荐答案

dplyr中,您可以使用mutateacross(contains("ttt")...)来测试列是否包含感兴趣的字符串.然后使用rowSums来合计实例数.由于在这种情况下,行和永远不会为负,所以一个小技巧是使用sign()将和转换为1或0,而不是逻辑测试(即ifelse(..)+(... > 0)):

library(dplyr)
df %>%
  mutate(cl_m = sign(rowSums(across(contains("ttt"), ~ +(.x %in% c("METO", "META"))))),
         cl_l = sign(rowSums(across(contains("ttt"), ~ +(.x %in% c("LETO", "LETA"))))))

输出:

#   ttt1 ttt2 cl_m cl_l
# 1 METO LETO    1    1
# 2 LETO         0    1
# 3 META METO    1    0
# 4 LETA         0    1
# 5 METO LETA    1    1

R相关问答推荐

如何创建构成多个独立列条目列表的收件箱框列?

如果行和列名以相同的开头,将矩阵值设置为0

无法运行通过R中的Auto.arima获得的ARIMA模型

如何修复R码的置换部分?

使用case_match()和char数组重新编码值

如何改变时间图R中的悬停信息?

根据元素和前一个值之间的差值过滤矩阵的元素

如果可能,将数字列转换为整数,否则保留为数字

将饼图插入条形图

以相同的方式对每个表进行排序

为什么我使用geom_density的绘图不能到达x轴?

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

将向量元素重新排序为R中的第二个

如何使用同比折线图中的个别日

R+reprex:在呈现R标记文件时创建可重现的示例

在R中,如何将误差条放置在堆叠的每个条上?

提高圣彼得堡模拟的速度

如何在Quarto中使用美人鱼图表中的标记来加粗文本

使用显式二元谓词子集化sfc对象时出错

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出