我有一个数据框,这样:
df$v1 = c('2', '', '', '', '3', '', '4', '', '', 'OT')
我想将此变量格式化为序数变量。然而,
df$v1 = as.ordered(df$v1)
结果是:
Ord.factor w/ 5 levels ""<"2"<"3"<"4"<..: 2 1 1 1 3 1 4 1 1 5
R 将空单元格读取为唯一条目,并将它们按顺序排列在最前面。我想要做的是用上面最后一个单元格的值(或根据您的方向在其左侧)填充空单元格以获得一个值。换句话说,这个向量实际上应该是这样的:
df$v1 = c('2', '2', '2', '2', '3', '3', '4', '4', '4', 'OT')
我相信此更改将允许我根据需要将变量格式化为序数。我已经尝试过as.ordered(),as.factor(),levels = c('1','2','3','4','OT')和ordered = TRUE的每种组合。但是,R 在包含时不使用“级别”或“有序”参数;as.factor() 函数,不使用“级别”或“有序”参数,不会产生序数变量;并且, as.ordered() 函数可以解决上述问题。因此,我相信在转换之前填充空单元格是最好的解决方案。最好的方法是什么?我知道我可以使用:
df$v1 = as.ordered(sub('^$', '2', df$v1))
用“2”填充空单元格;但是,每个单元格的替换值都不同。我可以做这样的事情:
df.a = df[1:4, ]
df.b = df[5:6, ]
df.c = df[7:9, ]
df.d = df[10, ]
df.a$v1 = as.ordered(sub('^$', '2', df.a$v1))
df.b$v1 = as.ordered(sub('^$', '3', df.b$v1))
df.c$v1 = as.ordered(sub('^$', '4', df.c$v1))
但是,我正在寻找一种自动执行此操作的方法。虽然在这种情况下,上述 7 行会产生我想要的结果,但我还有许多其他表格遇到相同的格式问题;并且,每个必要分区对应的行数各不相同。非常感谢您的帮助。
在将空格 ( )转换为 NA后,我们可以使用na.locf
fromzoo
将 NA 元素替换为非 NA 前一个相邻元素""
library(zoo)
df$v1 <- with(df, na.locf(replace(v1, v1=="", NA)))
df$v1
#[1] "2" "2" "2" "2" "3" "3" "4" "4" "4" "OT"
这也可以base R
通过创建一个分组变量然后填充它来完成ave
with(df, ave(v1, cumsum(v1!=""), FUN = function(x) x[1]))
#[1] "2" "2" "2" "2" "3" "3" "4" "4" "4" "OT"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句