【发布时间】:2016-04-27 14:53:48
【问题描述】:
我在数据框中有几个单元格包含一个数字,后跟一个星号。我想用 NA 替换单元格中的数据。这是示例数据
a<-c(1.23,"4.2*", 5,6,"8*")
b<-c(0.01,0.5,"3.687*",9,10)
c<-data.frame(a,b)
c
我试过 c[c=="*"]
【问题讨论】:
我在数据框中有几个单元格包含一个数字,后跟一个星号。我想用 NA 替换单元格中的数据。这是示例数据
a<-c(1.23,"4.2*", 5,6,"8*")
b<-c(0.01,0.5,"3.687*",9,10)
c<-data.frame(a,b)
c
我试过 c[c=="*"]
【问题讨论】:
尝试强制转换为数字:
data.frame( a = as.numeric(a), b = as.numeric(b) )
a b
1 1.23 0.01
2 NA 0.50
3 5.00 NA
4 6.00 9.00
5 NA 10.00
任何无效数字都将变为 NA。 OP 首选方法的缺点是,当您似乎应该使用数字时,您最终会得到一个充满因素或字符的 data.frame。
【讨论】:
is.na(c) <- sapply(c, grepl, pattern="\\*")
data.frame 时——这就是示例中的a 和b——它们被转换为因子。因子在引擎盖下用整数编码字符串。如果您此时尝试as.numeric 或as.integer,这些基础整数就是您所看到的。你可以使用as.numeric(as.character(c$a)) 来解决这个问题,但如果可以的话,最好避免这个问题。
我们也可以使用
c[] <- lapply(c, function(x) replace(x, grep("[*]", x), NA))
c
# a b
#1 1.23 0.01
#2 <NA> 0.5
#3 5 <NA>
#4 6 9
#5 <NA> 10
【讨论】:
lapply(c, function(x) type.convert(replace(as.character(x), grep("[*]", x), NA))) 这样的东西来获取数字(可能)应该在的地方。在magritrish:lapply(c, . %>% as.character %>% replace(grep("[*]", .), NA) %>% type.convert)
c[apply(c, 1:2, function(i) grepl('\\*', i))] <- NA
c
# a b
#1 1.23 0.01
#2 <NA> 0.5
#3 5 <NA>
#4 6 9
#5 <NA> 10
【讨论】: