过滤data.frame值

时间:2014-05-28 02:42:06

标签: r

我倾向于R而我有点失落。我有一个13列的data.frame。我的第13列是一个品牌的评级。但是我在该专栏中有很多不良数据。我该如何过滤该栏目?例如,对于任何产品的评级为1-5,但在我的.csv文件中,有空格,像INC这样的单词,像" bar"等等。所以我只想使用行其中评分为1-5而不使用其他任何内容的行。所以我必须写一个函数吗?使用ddply?感谢您的帮助

2 个答案:

答案 0 :(得分:2)

我只是制作一个简单的2列数据集。

dd <- data.frame(
    band=letters[1:8],
    rating=c("1","5","INC","3","bar",NA,"2","1")
)
#   band  col
# 1    a    1
# 2    b    5
# 3    c  INC
# 4    d    3
# 5    e  bar
# 6    f <NA>
# 7    g    2
# 8    h    1

我可以将此子集仅限于rating中的值为1,2,3,4或5的

dd[which(as.numeric(as.character(dd$rating)) %in% 1:5), ]
#   band col
# 1    a   1
# 2    b   5
# 4    d   3
# 7    g   2
# 8    h   1

所以你的列可能是R中的一个因素。所以我使用as.character来获取标签,然后使用as.numeric来获取该标签的数值。如果标签不是数字,则会将其转换为NA值。我不检查集合1:5中的哪些值,并将其包装在which中以便删除NA值。然后我使用这个数字向量将data.frame子集化为我感兴趣的行。您可以将此结果重新分配给一个新变量。您会收到有关匹配中NA值的警告,但这样做可以和我们期望的一样。

答案 1 :(得分:0)

首先,欢迎来到这个星球上最好的开源软件。

好的,这是一个例子。采取这个混乱的数据框x

> x <- data.frame(a = c("foo", "bar", "2", "INC", "5"), 
                  b = c("1", "NO", "foo", "3", "no"))
> x
#     a   b
# 1 foo   1
# 2 bar  NO
# 3   2 foo
# 4 INC   3
# 5   5  no

我们可以通过多种不同的方式找到数值,但我喜欢grep。以下显示b列的第1行和第4行包含数值

> grep('[0-9]+', as.character(x$b))
# [1] 1 4

我们可以将其保存为numsb

> numsb <- grep('[0-9]+', as.character(x$b))

使用向量运算

对这些行的数据框进行子集化
> x[numsb, ]
#     a b
# 1 foo 1
# 4 INC 3

请注意,您也可以将grep放入上面的子集中。但我会对列a使用grepl,逻辑grep

> x[grepl('[0-9]+', as.character(x$a)), ]
#   a   b
# 3 2 foo
# 5 5  no

其他列也是如此。如果您需要用于计算,则需要将列强制转换为类numeric

> z <- x[numsb,]
> z$b <- as.numeric(z$b)

和其他子集相同