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