有条件地填写R

时间:2017-03-01 02:32:22

标签: r paste missing-data

我有一个数据框,以便:

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(&#39; 1&#39;,&#39; 2&#39;,&#39; 3&#39)的每个组合;,&#39; 4&#39;,&#39; OT&#39;),并且ordered = TRUE。但是,R不使用&#34;级别&#34;或&#34;有序&#34;包含的论点; as.factor()函数,不使用&#34;级别&#34;或&#34;有序&#34;参数,不会产生序数变量;并且,as.ordered()函数重新解决了上述问题。因此,我认为在转换之前填充空单元是最佳解决方案。最好的方法是什么?我知道我可以使用:

df$v1 = as.ordered(sub('^$', '2', df$v1))

用&#34; 2&#34; s填充空单元格;但是,每个单元格的替换值都不同。我可以做类似的事情:

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行会产生我想要的结果,但是我有许多其他的表遇到了相同的格式问题;并且,对应于每个必需分区的行数对于每个分区是不同的。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

fill包中的tidyr怎么样?

library(tidyr)

df$v1 <- ifelse(df$v1 == '', NA, df$v1) # requires NA not empty string
df <- df %>% fill(v1)

答案 1 :(得分:1)

我们可以使用na.locf中的zoo将空格("")转换为NA

后用非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"