我想为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不仅会删除此行(很棒),还会删除每隔一行。
有谁知道解决方案?
答案 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)))