【问题标题】:Issue with replacing string by match in R在R中用匹配替换字符串的问题
【发布时间】:2018-12-10 20:37:49
【问题描述】:

如果单元格元素以“F”开头并且所有尾随单元格元素都在一行中,我想将单元格元素替换为“NA”。

如何在 R 中实现这一点?

感谢任何帮助。

 Table: 

    043  N  005 E 013  F001 00000003789 0005254  0009009  NA   NA       NA        NA NA NA 
    045  N  006 E 005  F001 00000012456 0005447  0001007  NA   NA       NA        NA NA NA
    045  N  007 E 015  F001 00000014556 0005847  0001107  F001 00001587 00007814  NA NA NA
    045  N  007 E 015  L002 044 N  006  E 036    F001     00001587      00007814  NA NA NA


Output:

        043  N  005 E 013  NA   NA   NA  NA  NA   NA       NA        NA NA NA 
        045  N  006 E 005  NA   NA   NA  NA  NA   NA       NA        NA NA NA
        045  N  007 E 015  NA   NA   NA  NA  NA   NA       NA        NA NA NA
        045  N  007 E 015  L002 044  N   006 E    036      NA        NA NA NA

请查看dput 输出

dput(head(Table))

structure(list(V29 = c("043", "045", "045", "043", "043", "044"
), V30 = c("N", "N", "N", "N", "N", "N"), V31 = c("005", "006", 
"007", "004", "004", "005"), V32 = c("E", "E", "E", "E", "E", 
"E"), V33 = c("013", "005", "035", "001", "001", "005"), V34 = c("F001", 
"F001", "F001", "L002", "L002", "F001"), V35 = c("000000037098944", 
"000000037098945", "000000037098919", "044", "044", "000000006844013"
), V36 = c("0005254", "0005447", "0005233", "N", "N", "0008090"
), V37 = c("0009009", "0010007", "0000904", "004", "004", "0001479"
), V38 = c("0005", "0001", "0005", "E", "E", "0021"), V39 = c(NA, 
NA, "F002", "036", "036", NA), V40 = c(NA, NA, "000000037098920", 
"F001", "F001", NA), V41 = c(NA, NA, "0005233", "000000004124126", 
"000000005660728", NA), V42 = c(NA, NA, "0000904", "0007249", 
"0007249", NA), V43 = c(NA, NA, "0006", "0011127", "0011127", 
NA), V44 = c(NA, NA, "F003", "0005", "0004", NA), V45 = c(NA, 
NA, "000000037098941", NA, "F002", NA), V46 = c(NA, NA, "0005233", 
NA, "000000006763171", NA), V47 = c(NA, NA, "0000904", NA, "0007249", 
NA), V48 = c(NA, NA, "0007", NA, "0011127", NA), V49 = c(NA, 
NA, "F004", NA, "0002", NA), V50 = c(NA, NA, "000000037098942", 
NA, "F003", NA), V51 = c(NA, NA, "0005233", NA, "000000037865325", 
NA), V52 = c(NA, NA, "0000904", NA, "0007249", NA), V53 = c(NA, 
NA, "0008", NA, "0011127", NA), V54 = c(NA, NA, NA, NA, "0003", 
NA), V55 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_), V56 = c(NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_), 
    V57 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V58 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V59 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V60 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V61 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V62 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V63 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V64 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V65 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V66 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V67 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V68 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V69 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V70 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V71 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V72 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V73 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V74 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V75 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V76 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    ), V77 = c(NA_character_, NA_character_, NA_character_, NA_character_, 
    NA_character_, NA_character_), V78 = c(NA_character_, NA_character_, 
    NA_character_, NA_character_, NA_character_, NA_character_
    )), class = c("data.table", "data.frame"), row.names = c(NA, 
-6L), .internal.selfref = <pointer: 0x2294f40>)

【问题讨论】:

  • 这是data.frame 还是matrix?如果您的数据是可复制的并且易于复制/粘贴,这将有所帮助。您可以将dput(head(x)) 的输出粘贴到您的问题中吗?
  • 它是一个数据框。请参阅我上面的问题以获取 dput 输出。谢谢。

标签: r string match


【解决方案1】:

为了简洁起见,我首先截断了您的数据:

x <- x[,5:12]

预先说明:我经常在data.frame 上使用apply 来说明,因为它隐式地将整个事物转换为具有最高常见类的matrix(通常character)。但是,在这种情况下,它实际上是我们想要的(字符串,所以我们可以grepl 他们)。如果您的框架中确实有数字,它们将被向上转换,这是真的,但除非您的数据是“大”的,否则它不会破坏性能。 (如果是,有解决方法。)

好的,那么我们先找到以F开头的字符串:

 t(apply(x, 1, function(a) grepl("^F", a)))
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
# [1,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
# [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
# [6,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

我们想用TRUE 转换所有东西,当然,还有它们右边的所有东西。我们可以使用cumany(累积any)逐行:

t(apply(x, 1, function(a) cumany(grepl("^F", a))))
#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] [,8]
# [1,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE
# [2,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE
# [3,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
# [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
# [6,] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE

现在一个简单的替换工作:

x[ t(apply(x, 1, function(a) cumany(grepl("^F", a)))) ] <- NA
x
#    V33  V34  V35  V36  V37  V38  V39  V40
# 1: 013 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 2: 005 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 3: 035 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 4: 001 L002  044    N  004    E  036 <NA>
# 5: 001 L002  044    N  004    E  036 <NA>
# 6: 005 <NA> <NA> <NA> <NA> <NA> <NA> <NA>

【讨论】:

  • 非常感谢。效果很好。这正是我想要的。
【解决方案2】:
for (i in 1:nrow(df)) {
    if (sum(grepl('F',as.character(df[i,])))>0) {
        df[i,6:ncol(df)] <- NA
    }
}

【讨论】:

  • 这并没有解决其他列中前导 F 的位置(不仅仅是一个)。
  • 我的错误。我误读了w.r.t的问题。在哪里可以找到“F”。感谢您指出了这一点。我已将我的答案编辑为一个可行的版本。
  • 还是不对。如果您将您的输出与所需的输出(以及我的答案)进行比较,您会发现当您找到 F 时,您总是替换第 6 列及以后的列,无论它在哪里找到。代码需要对找到F 的行中的where 做出反应。 (另外:您可以将sum(grepl(...))&gt;0 简化为any(grepl(...)),渐近地稍微快一些。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2016-09-14
  • 1970-01-01
  • 2015-11-03
  • 2021-04-25
相关资源
最近更新 更多