我很感激这个帮助。我有类似于下面的数据。
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
欢迎任何帮助。
答案 0 :(得分:1)
在我看来,缺失值由.
表示。最好使用na.strings="."
读取数据集,以使缺失的值为NA
。对于当前数据集,“B”列将为character/factor
类(取决于您是否在stringsAsFactors=FALSE/TRUE
中使用了read.table/read.csv
(默认)。
使用data.table
,我们将data.frame
转换为data.table
(setDT(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))