我有3列数据,我想用它来填充D列(最后结果的示例如下,当前列D为空白)。对于每一行,列A-C将具有1个填充值和2个NA值。我怎么能这样做?
A B C D
1 'a' NA NA 'a'
2 NA 'b' NA 'b'
3 NA 'b' NA 'b'
4 NA NA 'c' 'c'
5 NA NA 'c' 'c'
6 'a' NA NA 'a'
7 'a' NA NA 'a'
8 NA NA 'c' 'c'
我尝试了以下功能,虽然它没有出错,但它并没有填充我的数据集。我想知道我做错了什么。
感谢您的帮助
pop_D <- function(dataset){
for(i in 1:nrow(dataset)){
if(!is.na(dataset[i,'A'])){
dataset[i,'D'] <- dataset[i,'A']
}else if(!is.na(dataset[i,'B'])){
dataset[i,'D'] <- dataset[i,'B']
}else{
dataset[i,'D'] <- dataset[i,'C']
}
}
}
pop_D(ds)
答案 0 :(得分:1)
我们可以使用pmax
来执行此操作
df1$D <- do.call(pmax, c(df1[1:3], na.rm = TRUE))
df1$D
#[1] "a" "b" "b" "c" "c" "a" "a" "c"
或者第二个选项是对非NA元素的逻辑max.col
应用matrix
以获取具有行索引的列索引cbind
,并根据这些索引提取元素
df1[1:3][cbind(1:nrow(df1), max.col(!is.na(df1[1:3]), 'first'))]
#[1] "a" "b" "b" "c" "c" "a" "a" "c"
答案 1 :(得分:0)
作为akrun答案的补充,如果您有一个矩阵(或您使用as.matrix()
转换的数据框),您只需合并所有数据并省略所有NA
& #39; s创建变量D,即
mt<-matrix(c("a",NA,NA,"a",NA,"b",NA,NA,NA,NA,"c",NA),ncol=3) #create test data
cbind(mt,na.omit(c(as.matrix(mt))))
答案 2 :(得分:0)
考虑dft
作为输入,您可以使用dplyr
并执行:
dft %>%
mutate(D = coalesce(A,B,C))
给出:
A B C D
1 a <NA> <NA> a
2 <NA> b <NA> b
3 <NA> b <NA> b
4 <NA> <NA> c c
5 <NA> <NA> c c
6 a <NA> <NA> a
7 a <NA> <NA> a
8 <NA> <NA> c c
P.S。我通过将问题复制为:
来准备样本输入数据dft <- read.table(header = TRUE, text = "id A B C D
1 'a' NA NA 'a'
2 NA 'b' NA 'b'
3 NA 'b' NA 'b'
4 NA NA 'c' 'c'
5 NA NA 'c' 'c'
6 'a' NA NA 'a'
7 'a' NA NA 'a'
8 NA NA 'c' 'c'",stringsAsFactors=FALSE)
dft$id<- NULL
dft$D <- NULL