将na.fill应用于每一列

时间:2018-10-19 00:55:30

标签: r na

我有一个像这样的数据集:

Col1    Col2     Col3     Col4    Col5   
   A       B        4        5       7
   G       H        5        6      NA
   H       I       NA        9       8
   K       F        9       NA      NA
   E       L       NA        8       9
   H       I        1        0      10

我如何将na.fill()函数应用于Col2之后的所有列?

如果我要单独进行操作,它将是这样的:

df$Col3<-na.fill(df$Col3, c(NA, "extend", NA))
df$Col4<-na.fill(df$Col4, c(NA, "extend", NA))
df$Col5<-na.fill(df$Col5, c(NA, "extend", NA))  

问题是我的实际数据框有100多个列。有没有一种快速的方法将此功能应用于前两列之后的所有列?

2 个答案:

答案 0 :(得分:1)

na.fill 可以处理多个列。确实不需要使用lapplymutate等。只需将相关列替换为在同一列上运行na.fill的结果即可。如果您知道ix是什么,则可以用它替换第一行,以便在本示例中我们可以交替使用ix <- 3:5ix <- -(1:2)

ix <- sapply(DF, is.numeric)
replace(DF, ix, na.fill(DF[ix], c(NA, "extend", NA)))

给予:

  Col1 Col2 Col3 Col4 Col5
1    A    B    4  5.0  7.0
2    G    H    5  6.0  7.5
3    H    I    7  9.0  8.0
4    K    F    9  8.5  8.5
5    E    L    5  8.0  9.0
6    H    I    1  0.0 10.0

请注意,您可以交替使用na.approx

replace(DF, ix, na.approx(DF[ix], na.rm = FALSE))

注意

Lines <- "Col1    Col2     Col3     Col4    Col5   
   A       B        4        5       7
   G       H        5        6      NA
   H       I       NA        9       8
   K       F        9       NA      NA
   E       L       NA        8       9
   H       I        1        0      10"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE, strip.white = TRUE)

答案 1 :(得分:0)

mutate_包中的dplyr系列功能可以解决问题。

有几种方法可以做到这一点。根据您其他栏的外观,某些栏可能比其他栏更好。这是三个在不同情况下效果更好的版本。

# Make dummy data.
df <- data.frame(
    Col1 = LETTERS[1:6],
    Col2 = LETTERS[7:12],
    Col3 = c(4, 5, NA, 9, NA, 1),
    Col4 = c(5,6,9,NA,8,0),
    Col5 = c(7,NA,8,NA,9,10)
)

您可以将na.fill函数应用于名称向量指定的列。如果要使用正则表达式选择带有某些名称部分的列,此功能将非常有用。

cn <- names(df) %>%
    str_subset("[345]")    # Column names with 3, 4 or 5 in them.

result_1 <- df %>% 
    mutate_at(vars(cn),
        zoo::na.fill, c(NA, 'extend', NA)
        )

您可以将na.fill函数应用于任何数字列。

result_2 <- df %>%
    mutate_if(is.numeric,    # First argument is function that returns a logical vector.
        zoo::na.fill, c(NA, 'extend', NA)
        )

您可以将该函数应用于数字索引向量中指定的列。

result_3 <- df
result_3[ , 3:5] <- result_3[ , 3:5] %>%    # Just replace columns 3 through 5
    mutate_all(
        zoo::na.fill, c(NA, 'extend', NA)
        )

在这种情况下,所有三个版本都应该做相同的事情。

all.equal(result_1, result_2)    # TRUE
all.equal(result_1, result_3)    # TRUE