R 如何通过stubsituting NA'混合两列;s

R 如何通过stubsituting NA'混合两列;s,r,R,我有一个巨大的数据框,有两列需要合并。我可能想知道这是否和本文中提到的问题不一样,但我的数据帧实际上并不存在两列。还有很多(有很多NA),我只想处理其中的两个,我想这会让事情变得更复杂一些 这是其中的一部分: col1 col2 15 NA 4 16 NA 5 17 NA 5 18 NA 5 19 NA 1 20 NA NA 21 NA NA 22 1 NA 23 5 NA 24 2 NA 2

我有一个巨大的数据框,有两列需要合并。我可能想知道这是否和本文中提到的问题不一样,但我的数据帧实际上并不存在两列。还有很多(有很多NA),我只想处理其中的两个,我想这会让事情变得更复杂一些

这是其中的一部分:

    col1 col2
15   NA    4
16   NA    5
17   NA    5
18   NA    5
19   NA    1
20   NA   NA
21   NA   NA
22   1    NA
23   5    NA
24   2    NA
25   4    NA
26   3    NA
27   NA    2
28   NA    4
29   NA    5
30   NA    3
我需要通过替换彼此的NA将这些列合并为一个。当两列都包含NA时,不会发生预置换(但这是显而易见的)

结果应该如下所示:

    col1
15   4    
16   5  
17   5  
18   5  
19   1  
20   NA 
21   NA 
22   1  
23   5  
24   2  
25   4  
26   3  
27   2  
28   4  
29   5  
30   3  
我尝试了一个丑陋的for循环:

for (i in 1:nrow(df)){
  if (is.na(df[i,1])==TRUE){
    df[i,1] <- df[i,2]
  }
 }
df <- df[,1]
for(1中的i:nrow(df)){
如果(is.na(df[i,1])==TRUE){

df[i,1]无需循环,因为您可以分配给子集:

df$col1[is.na(df$col1)] <- df$col2[is.na(df$col1)]

df$col1[is.na(df$col1)]无需循环,因为您可以分配给子集:

df$col1[is.na(df$col1)] <- df$col2[is.na(df$col1)]

df$col1[is.na(df$col1)]像SQL这样的语言有一个名为
coalesce
的函数,该函数返回给定一组列表的第一个非缺失值。我在R中编写了一个函数来执行此行为

coalesce<-function(...) {
    x<-lapply(list(...), function(z) {if (is.factor(z)) as.character(z) else z})
    m<-is.na(x[[1]])
    i<-2
    while(any(m) & i<=length(x)) {
        if ( length(x[[i]])==length(x[[1]])) {
            x[[1]][m]<-x[[i]][m]
        } else if (length(x[[i]])==1) {
            x[[1]][m]<-x[[i]]
        } else {
            stop(paste("length mismatch in argument",i," - found:", length( x[[i]] ),"expected:",length( x[[1]] ) ))
        }
        m<-is.na(x[[1]])
        i<-i+1
    }
    return(x[[1]])
}
如果所有行都是NA,也可以添加默认值

coalesce(col1,col2, -9)
它返回一个新列,而不是修改任何原始列


我尝试将函数的最新版本保留在

上,像SQL这样的语言有一个名为
coalesce
的函数,该函数返回给定一组列表的第一个非缺失值

coalesce<-function(...) {
    x<-lapply(list(...), function(z) {if (is.factor(z)) as.character(z) else z})
    m<-is.na(x[[1]])
    i<-2
    while(any(m) & i<=length(x)) {
        if ( length(x[[i]])==length(x[[1]])) {
            x[[1]][m]<-x[[i]][m]
        } else if (length(x[[i]])==1) {
            x[[1]][m]<-x[[i]]
        } else {
            stop(paste("length mismatch in argument",i," - found:", length( x[[i]] ),"expected:",length( x[[1]] ) ))
        }
        m<-is.na(x[[1]])
        i<-i+1
    }
    return(x[[1]])
}
如果所有行都是NA,也可以添加默认值

coalesce(col1,col2, -9)
它返回一个新列,而不是修改任何原始列


我尝试保持函数的最新版本处于启用状态

如果您要使用sql来更新列1的可能重复项的可能重复项,这可能很简单如果您要使用sql来更新列1的可能重复项的可能重复项的可能重复项的,这可能很简单您确定这会起作用吗?我收到以下消息:“要替换的项目数量不是替换长度的倍数”请确保每侧方括号内的代码相同,如罗兰的示例中所示。即col1两次,而不是col1在左侧,col2在右侧。您确定这应该有效吗?我收到了以下消息:“要替换的项目数量不是替换长度的倍数。”“确保每侧方括号内的代码与罗兰的示例中的代码相同,即col1两次,而不是col1在左侧,col2在右侧。