为什么R中的grepl删除每隔一行(虽然没有指定)

时间:2018-04-10 19:46:49

标签: r grepl

我想为R中的分析准备多个数据帧。 其中一些确实包含第一行(类型1)中的变量标签(=字符串),一些不包含(类型2)。请注意,我不是指第一行的标题。 所有其他行都包含数值。

我的输入数据框: 输入1:

x轴y轴

0     200  
5     299
4     314
17    117

类型2:

0     200  
5     299
4     314
17    117

最后,我希望在第一行中没有这些字符串的所有数据帧。 两种类型的预期输出:

0     200  
5     299
4     314
17    117

因为我不想手动检查哪些数据框包含字符串,所以我希望在删除"字符串行的所有数据帧中运行代码"。

我注意到有些代码会从不包含字符串的数据框中删除所有数据。 所以,我现在使用以下代码来防止这个问题:

df_new< - df [!grepl(" x-axis",df),]

对于没有这些字符串的数据框,这是完美的工作(=没有任何反应)。 但是,对于包含这些字符串的数据帧,R不仅会删除此行(很棒),还会删除每隔一行。

有谁知道解决方案?

2 个答案:

答案 0 :(得分:1)

正如@AndrewGustar所评论的,您应该将列传递给grepl,而不是整个data.frame。但是更多的解释也可能对此有所帮助。

grepl的第二个参数通常应该是一个字符向量。但如果不是,则R将尝试使用as.character将其强制转换为一个。让我们做一个虚拟的例子,看看它是如何工作的:

df = data.frame(V1=c('x', rep('foo',9)), V2 = 1:10, stringsAsFactors = F)
    # V1 V2
# 1    x  1
# 2  foo  2
# 3  foo  3
# 4  foo  4
# 5  foo  5
# 6  foo  6
# 7  foo  7
# 8  foo  8
# 9  foo  9
# 10 foo 10

现在,如果我们as.character(df),我们会得到

[1] "c(\"x\", \"foo\", \"foo\", \"foo\", \"foo\", 
       \"foo\", \"foo\", \"foo\", \"foo\", \"foo\")"
[2] "1:10" 

grepl对此进行操作会在第一个元素中找到搜索字符串'x',但不会在第二个元素中找到:

grepl("x", df)
# [1]  TRUE FALSE

这会在df[!grepl("x", df) , ]中回收,以便每隔一行返回

df_new
#    V1 V2
#2  foo  2
#4  foo  4
#6  foo  6
#8  foo  8
#10 foo 10

所以解决方案就是greli你想要的列:

df_new <- df[!grepl("x", df$V1) , ]

注意

as.character将第二列作为1:10返回这一事实的有趣且可能不直观的副作用是grepl("1", df)给出[1] FALSE TRUE(如预期的那样)。但是,grepl("4", df)会返回[1] FALSE FALSE,即使第4列中出现了4。

答案 1 :(得分:0)

如果您在data.frame上调用is for case insensitive and,它将按列返回结果,而不是按单元格返回。

grepl

如果您只想搜索一列,请使用@AndrewGustar的解决方案,然后将该列传递给grepl:

df <- data.frame('a' = c('th', 'the', 'tre', 'test'),
                 'b' = c('cat', 'cart', 'ca', 'fat'),
                 'c' = c('re', 'awe', 'io', 'ko'),
                 stringsAsFactors = FALSE)

grepl('cat', df)
[1] FALSE  TRUE FALSE

如果要获取具有任意值的行,请按行应用grepl('cat', df$b)

apply

或删除包含该值的行:

apply(df, 1, function(x) sum(grepl('cat', x)))