Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用NA以外的值填充merge(…,all=TRUE,…)中缺少的值?_R_Dataframe_Merge_Outer Join_Na - Fatal编程技术网

如何用NA以外的值填充merge(…,all=TRUE,…)中缺少的值?

如何用NA以外的值填充merge(…,all=TRUE,…)中缺少的值?,r,dataframe,merge,outer-join,na,R,Dataframe,Merge,Outer Join,Na,简言之:我正在寻找一种常规方法,用NA以外的常量填充merge(…,all=TRUE,…)中缺少的值 假设 z <- merge(x, y, all = TRUE, ...) 在这种情况下,结果中唯一的NA条目是由merge引入的条目,因此执行以下操作: z[is.na(z)] <- FILL_VALUE ## > z ## K I R B C S1 S2 ## 1 1001 3 0.1 TRUE 0.1+0.2i a d ##

简言之:我正在寻找一种常规方法,用
NA
以外的常量填充
merge(…,all=TRUE,…)
中缺少的值


假设

z <- merge(x, y, all = TRUE, ...)
在这种情况下,结果中唯一的
NA
条目是由
merge
引入的条目,因此执行以下操作:

z[is.na(z)] <- FILL_VALUE

## > z
##      K I   R     B        C S1 S2
## 1 1001 3 0.1  TRUE 0.1+0.2i  a  d
## 2 1002 4 0.2 FALSE 0.3+0.4i  b  e
## 3 1003 5 0.3  TRUE 0.5+0.6i  c  f
## 4 1004 6 0.4 FALSE 0.7+0.8i  -  -
## 5 1005 7 0.5  TRUE 0.9+1.0i  -  -
因此,这样做不行:

zna[is.na(zna)] <- FILL_VALUE
## > zna
##      K I   R     B        C S1 S2
## 1 1001 - 0.1  TRUE 0.1+0.2i  -  d
## 2 1002 4   - FALSE 0.3+0.4i  b  -
## 3 1003 5 0.3     - 0.5+0.6i  c  f
## 4 1004 6 0.4 FALSE        -  -  -
## 5 1005 7 0.5  TRUE   0.9+1i  -  -
你可以这样做

> FILL_VALUE <- "-"
> 
> xna <- data.frame(K=1001:1005,
+                   I=c(NA, 4:7),
+                   R=c(0.1, NA, 0.3, 0.4, 0.5),
+                   B=c(TRUE, FALSE, NA, FALSE, TRUE),
+                   C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, NA, 0.9+1.0i))
> 
> yna <- data.frame(K=1001:1003,
+                   S1=c(NA, "b", "c"),
+                   S2=c("d", NA, "f"),
+                   stringsAsFactors = FALSE)
> 
> 
> # add bools
> xna$has_xna <- TRUE
> yna$has_yna <- TRUE
> 
> # merge
> zna <- merge(xna, yna, all = TRUE, by = "K")
> zna
     K  I   R     B        C has_xna   S1   S2 has_yna
1 1001 NA 0.1  TRUE 0.1+0.2i    TRUE <NA>    d    TRUE
2 1002  4  NA FALSE 0.3+0.4i    TRUE    b <NA>    TRUE
3 1003  5 0.3    NA 0.5+0.6i    TRUE    c    f    TRUE
4 1004  6 0.4 FALSE       NA    TRUE <NA> <NA>      NA
5 1005  7 0.5  TRUE 0.9+1.0i    TRUE <NA> <NA>      NA
> 
> # fill in for NAs due to merge
> yna_cols <- colnames(zna) %in% colnames(yna)
> zna[, yna_cols][is.na(zna[, yna_cols]) & is.na(zna$has_yna)] <- FILL_VALUE
> zna$has_yna <- NULL # remove column
> 
> # do the same for xna
> xna_cols <- colnames(zna) %in% colnames(xna)
> zna[, xna_cols][is.na(zna[, xna_cols]) & is.na(zna$has_xna)] <- FILL_VALUE
> zna$has_yna <- NULL # remove column
> 
> # Final results
> zna
     K  I   R     B        C has_xna   S1   S2
1 1001 NA 0.1  TRUE 0.1+0.2i    TRUE <NA>    d
2 1002  4  NA FALSE 0.3+0.4i    TRUE    b <NA>
3 1003  5 0.3    NA 0.5+0.6i    TRUE    c    f
4 1004  6 0.4 FALSE       NA    TRUE    -    -
5 1005  7 0.5  TRUE 0.9+1.0i    TRUE    -    -
>填充值
>新华社
>伊娜
> 
>#添加布尔
>xna$hasxnayna$has_yna
>#合并
>zna-zna
KI R B C有_xnas1 S2有_yna
1 1001 NA 0.1真值0.1+0.2i真值d真值
2 1002 4 NA假0.3+0.4i真b真
3 1003 5 0.3 NA 0.5+0.6i真c f真
4 1004 6 0.4假不适用真不适用
5 1005 7 0.5真0.9+1.0i真NA
> 
>#因合并而填写NAs
>yna_cols zna[,yna_cols][is.na(zna[,yna_cols])和is.na(zna$has_yna)]zna$has_yna
>#对xna也一样
>xna_cols zna[,xna_cols][is.na(zna[,xna_cols])和is.na(zna$has_xna)]zna$has_yna
>#最终结果
>锌纳
KI R B C具有xna S1 S2
1 1001 NA 0.1真值0.1+0.2i真值d
2 1002 4 NA假0.3+0.4i真b
31003 5 0.3钠0.5+0.6i真碳纤维
4 1004 6 0.4假NA真--
5100570.5真值0.9+1.0i真值--

上述内容可以很容易地重写为通用合并函数包装。另一个选项是使用
data.table
上的
nomatch
参数来
[.data.table
函数。

也许您可以在%yna$K
中找到带有
!zna$K%的行,以及列“S1”和“S2”上的
is.na
来分配这个问题的第二个答案,它似乎为您的问题提供了一个解决方案:关于
合并(x=replace(x=xna,list=is.na(xna),values=“xna”)呢,y=replace(x=yna,list=is.na(yna),values=“yna”),by=“K”,all=TRUE)
@kjo,如果您使用
Inf
而不是
“XNA”
“yna”
@d.b:这是一个有趣的想法,但它也有类似的问题。例如,它强制整数加倍,例如.Plus(令人惊讶的是),
is.infinite
未为数据帧实现,因此无法使用
zna[is.infinite(zna)]
## > zna
##      K  I   R     B        C   S1   S2
## 1 1001 NA 0.1  TRUE 0.1+0.2i <NA>    d
## 2 1002  4  NA FALSE 0.3+0.4i    b <NA>
## 3 1003  5 0.3    NA 0.5+0.6i    c    f
## 4 1004  6 0.4 FALSE       NA    -    -
## 5 1005  7 0.5  TRUE 0.9+1.0i    -    -
zna[is.na(zna)] <- FILL_VALUE
## > zna
##      K I   R     B        C S1 S2
## 1 1001 - 0.1  TRUE 0.1+0.2i  -  d
## 2 1002 4   - FALSE 0.3+0.4i  b  -
## 3 1003 5 0.3     - 0.5+0.6i  c  f
## 4 1004 6 0.4 FALSE        -  -  -
## 5 1005 7 0.5  TRUE   0.9+1i  -  -
## > zna[, "I"]
## [1] "-" "4" "5" "6" "7"
## > zna[, "B"]
## [1] "TRUE"  "FALSE" "-"     "FALSE" "TRUE" 
## > zna[, "R"]
## [1] "0.1" "-"   "0.3" "0.4" "0.5"
## > zna[, "C"]
## [1] "0.1+0.2i" "0.3+0.4i" "0.5+0.6i" "-"        "0.9+1i"  
> FILL_VALUE <- "-"
> 
> xna <- data.frame(K=1001:1005,
+                   I=c(NA, 4:7),
+                   R=c(0.1, NA, 0.3, 0.4, 0.5),
+                   B=c(TRUE, FALSE, NA, FALSE, TRUE),
+                   C=c(0.1+0.2i, 0.3+0.4i, 0.5+0.6i, NA, 0.9+1.0i))
> 
> yna <- data.frame(K=1001:1003,
+                   S1=c(NA, "b", "c"),
+                   S2=c("d", NA, "f"),
+                   stringsAsFactors = FALSE)
> 
> 
> # add bools
> xna$has_xna <- TRUE
> yna$has_yna <- TRUE
> 
> # merge
> zna <- merge(xna, yna, all = TRUE, by = "K")
> zna
     K  I   R     B        C has_xna   S1   S2 has_yna
1 1001 NA 0.1  TRUE 0.1+0.2i    TRUE <NA>    d    TRUE
2 1002  4  NA FALSE 0.3+0.4i    TRUE    b <NA>    TRUE
3 1003  5 0.3    NA 0.5+0.6i    TRUE    c    f    TRUE
4 1004  6 0.4 FALSE       NA    TRUE <NA> <NA>      NA
5 1005  7 0.5  TRUE 0.9+1.0i    TRUE <NA> <NA>      NA
> 
> # fill in for NAs due to merge
> yna_cols <- colnames(zna) %in% colnames(yna)
> zna[, yna_cols][is.na(zna[, yna_cols]) & is.na(zna$has_yna)] <- FILL_VALUE
> zna$has_yna <- NULL # remove column
> 
> # do the same for xna
> xna_cols <- colnames(zna) %in% colnames(xna)
> zna[, xna_cols][is.na(zna[, xna_cols]) & is.na(zna$has_xna)] <- FILL_VALUE
> zna$has_yna <- NULL # remove column
> 
> # Final results
> zna
     K  I   R     B        C has_xna   S1   S2
1 1001 NA 0.1  TRUE 0.1+0.2i    TRUE <NA>    d
2 1002  4  NA FALSE 0.3+0.4i    TRUE    b <NA>
3 1003  5 0.3    NA 0.5+0.6i    TRUE    c    f
4 1004  6 0.4 FALSE       NA    TRUE    -    -
5 1005  7 0.5  TRUE 0.9+1.0i    TRUE    -    -