【问题标题】:Determine if sub string appears in a string by row of dataframe通过数据帧的行确定子字符串是否出现在字符串中
【发布时间】:2019-08-02 11:59:48
【问题描述】:

我有一个每天都会修改的数据框。当发生错误时,检查它,如果可以解决,则在错误消息的开头添加关键字“REVISED”。像这样:

ID  M1               M2                M3        
1   NA               "REVISED-error"   "error"    
2   "REVISED-error"  "REVISED-error"   NA        
3   "REVISED-error"  "REVISED-error"   "error"   
4   NA               "error"           NA         
5   NA               NA                NA           

我想找个方法加两列,帮我判断有没有错误,修改了多少。像这样:

ID  M1               M2                M3         i1   ix
1   NA               "REVISED-error"   "error"    2    1    <- 2 errors, 1 revised
2   "REVISED-error"  "REVISED-error"   NA         2    2
3   "REVISED-error"  "REVISED-error"   "error"    3    2
4   NA               "error"           NA         1    0
5   NA               NA                NA         0    0

我找到了这段代码:

df <- df%>%mutate(i1 = rowSums(!is.na(.[2:4])))

这有助于我了解这些特定列中有多少错误。我如何知道是否有任何上述错误包含关键字 REVISED?我已经尝试了一些方法,但到目前为止都没有奏效:

df <- df%>% mutate(i1 = rowSums(!is.na(.[2:4])))%>% mutate(ie = rowSums(.[2:4) %in% "REVISED")

这会返回错误x must be an array of at least two dimensions

【问题讨论】:

  • 什么定义了错误?这里的 2 是什么意思? 1 NA REVISED-x X 2 1
  • @NelsonGon 你是什么意思?错误是这样的字符串This is an error,如果我解决了这个问题,我会添加Revised_This is an error。这能回答你的问题吗?
  • 好的,ixi1 呢,它们应该显示什么?在我看来,NA 确实以某种方式对ix 做出了贡献,但不是很清楚。
  • @NelsonGon i1 应该按行播种多少错误(例如,ID 1 有 2 个错误), ix 显示已修改了多少错误(对于 ID 1,只有一个它的错误已被修改,所以 1) 等等。 NA 被认为没有错误,我的意思是如果它是空的,那么就没有错误
  • @NelsonGon 希望编辑现在更有意义

标签: r regex dplyr


【解决方案1】:

您可以使用apply 来查找"error""REVISED" 在每一行中出现的次数。

df[c("i1", "ix")] <- t(apply(df[-1], 1, function(x) 
                  c(sum(grepl("error", x)), sum(grepl("REVISED", x)))))


df
#  ID            M1            M2    M3 i1 ix
#1  1          <NA> REVISED-error error  2  1
#2  2 REVISED-error REVISED-error  <NA>  2  2
#3  3 REVISED-error REVISED-error error  3  2
#4  4          <NA>         error  <NA>  1  0
#5  5          <NA>          <NA>  <NA>  0  0

使用is.narowSums 计算i1 的替代方法。

df$i1 <- rowSums(!is.na(df[-1]))
df$ix <- apply(df[-1], 1, function(x) sum(grepl("REVISED", x)))

数据

df <- structure(list(ID = 1:5, M1 = structure(c(NA, 1L, 1L, NA, NA), 
.Label = "REVISED-error", class = "factor"), 
M2 = structure(c(2L, 2L, 2L, 1L, NA), .Label = c("error", 
"REVISED-error"), class = "factor"), M3 = structure(c(1L, 
NA, 1L, NA, NA), .Label = "error", class = "factor")), row.names = c(NA, 
-5L), class = "data.frame")

【讨论】:

  • @Ronak_Shah 如果错误文本不同,我还能使用!is.na() 方法吗?
  • @aaronparrilla 据我了解这个问题。 !is.na 会告诉你有多少错误没有发生。它不能给你一个单独的错误发生和错误修正的计数。
  • @Ronak_Shah 问题是错误不仅仅说错误,它们有一些任意文本。如果我在该特定列范围内找到任何值,则表示有人创建了一条错误消息,因此,如果它不是 NA,那么它就是一个错误。这就是我问的原因
  • @aaronparrilla ok..我添加了一种使用!is.na 计算i1 的方法。
【解决方案2】:

您可以使用stringr 库中的str_count() 来计算REVISED 出现的次数,就像这样

df <- data.frame(M1=as.character(c(NA, "REVISED-x", "REVISED-x")),
                 M2=as.character(c("REVISED-x", "REVISED-x", "REVISED-x")), 
                 stringsAsFactors = FALSE)

library(stringr)
df$ix <- str_count(paste0(df$M1, df$M2), "REVISED")

df

#          M1        M2 ix
# 1      <NA> REVISED-x  1
# 2 REVISED-x REVISED-x  2
# 3 REVISED-x REVISED-x  2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多