R 如何通过stubsituting NA'混合两列;s
我有一个巨大的数据框,有两列需要合并。我可能想知道这是否和本文中提到的问题不一样,但我的数据帧实际上并不存在两列。还有很多(有很多NA),我只想处理其中的两个,我想这会让事情变得更复杂一些 这是其中的一部分: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
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在右侧。