如果给定列中的行为空或NA,我如何对数据框中的行进行子集化。例如:
x <- c(1,2,3,4,"","","")
y <- c("A","B","C","D","E","F","G")
z <- c(100,200,300,400,500,600,700)
xyz <- data.frame(x,y,z)
View(xyz)
g1 <- subset(xyz, subset=(x > 0))
返回:
警告讯息: 在Ops.factor(x,0)中:&gt;对因素没有意义
如何让它返回一个新数据框,该数据框是原始的一个子集,但只包含X列大于零的行?
答案 0 :(得分:3)
创建数据框时,您指定x
应为因子变量。
(从技术上讲,你指定它应该是字符,但是data.frame
已经读过你的想法并将它转换为你的因素。再次,从技术上讲,你没有指明它应该是字符,但是R已经读过你的因为你试图在一个向量中组合数字和字符,它会将它们全部强制转换为字符模式的向量。)
因此,在此上下文中,“大于零”作为比较运算符没有意义。我将会阅读您的想法并得出结论,您确实希望x
为数字,但允许值不可用的情况。在这种情况下,你应该做
xyz$x <- as.numeric(as.character(xyz$x))
subset(xyz, !is.na(x))
答案 1 :(得分:2)
因为x
被存储为一个因子,所以大于一个值在这里没有任何意义。您可以使用索引:
xyz[xyz$x != "",]
# x y z
# 1 1 A 100
# 2 2 B 200
# 3 3 C 300
# 4 4 D 400
NA
与""
不同,您可以使用is.na()
对其进行逻辑测试。因此,如果此案例中的值为NA
而不是""
,那么xyz[!is.na(xyz$x),]
就可以解决问题