根据R中的第二列填充列的空格

时间:2015-07-01 20:31:33

标签: r fill

我很感激这个帮助。我有类似于下面的数据。

df$A df$B
1    .
1    .
1    .
1    6
2    .
2    .
2    7

我需要做的是在df$B中填入与df$A中值的运行结束相对应的每个值。示例如下。

df$A df$B
1    6
1    6
1    6
1    6
2    7
2    7
2    7

欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

在我看来,缺失值由.表示。最好使用na.strings="."读取数据集,以使缺失的值为NA。对于当前数据集,“B”列将为character/factor类(取决于您是否在stringsAsFactors=FALSE/TRUE中使用了read.table/read.csv(默认)。

使用data.table,我们将data.frame转换为data.tablesetDT(df1)),将'character'类更改为'numeric'(B:= as.numeric(B))。这也会导致.强制转换为NA(会出现警告)。按“A”分组,我们将“B”值更改为最后一个元素(B:= B[.N]

library(data.table)
setDT(df1)[,B:= as.numeric(B)][,B:=B[.N] , by = A]
#   A B
#1: 1 6
#2: 1 6
#3: 1 6
#4: 1 6
#5: 2 7
#6: 2 7
#7: 2 7

dplyr

library(dplyr)
df1 %>%
     group_by(A) %>%
     mutate(B= as.numeric(tail(B,1)))

或使用ave

中的base R
df1$B <- with(df1, as.numeric(ave(B, A, FUN=function(x) tail(x,1))))

数据

df1 <- structure(list(A = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), B = c(".", 
".", ".", "6", ".", ".", "7")), .Names = c("A", "B"), 
class = "data.frame", row.names = c(NA, -7L))