我是R.的新手。当我试图连续找到最后一个填充值时,我的任务中遇到了一些麻烦。比方说,我有一张表,如:
Name D1 D2 D3 D4 D5
-----+----+----+----+----+----
Stacy 1 4 NA 6 NA
Joy NA 4 8 NA 8
Anna NA NA 7 1 NA
Ray 2 NA 3 NA NA
Fey 8 NA NA NA NA
根据数据,我想从每一行中提取最后一个填充值。我尝试构建的预期表格就像
Name D1 D2 D3 D4 D5 LastD
-----+----+----+----+----+----+-------
Stacy 1 4 NA 6 NA 6
Joy NA 4 8 NA 8 8
Anna NA NA 7 1 NA 1
Ray 2 NA 3 NA NA 2
Fey 8 NA NA NA NA 8
或者只有一列“LastD”没问题。到目前为止,这是我写的代码。
data2 <- for (i in 1:nrow(data)) {
x <- rep(0, nrow(data))
for (j in ncol(data):1) {
if (!is.na(data[i,j])) {
x[i] <- data[i,j]
}
}
return(x)
}
我知道这是一个非常简单的代码,我也意识到它在这里和那里都有它的缺陷。你能帮我改进一下吗?
答案 0 :(得分:4)
你可以这样做:
df <- read.table(text = '
D1 D2 D3 D4 D5
Stacy 1 4 NA 6 NA
Joy NA 4 8 NA 8
Anna NA NA 7 1 NA
Ray 2 NA 3 NA NA
Fey 8 NA NA NA NA',
header = TRUE)
df$D6 <- apply(df, 1, function(x) tail(x[!is.na(x)], 1))
df
D1 D2 D3 D4 D5 D6
Stacy 1 4 NA 6 NA 6
Joy NA 4 8 NA 8 8
Anna NA NA 7 1 NA 1
Ray 2 NA 3 NA NA 3
Fey 8 NA NA NA NA 8
答案 1 :(得分:2)
以下是使用row/column
提取值
df$D6 <- df[cbind(seq_len(nrow(df)), max.col(!is.na(df), "last"))]
df$D6
#[1] 6 8 1 3 8