Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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
如何扩展R中包含NA的行_R_Dataframe - Fatal编程技术网

如何扩展R中包含NA的行

如何扩展R中包含NA的行,r,dataframe,R,Dataframe,我有一个数据帧D: D=matrix(c(1,4,1,4,2,NA,4,2,3,2,1,3,4,3,2,1),nrow=4,ncol=4) D<-as.data.frame(D) > D V1 V2 V3 V4 1 1 2 3 4 2 4 NA 2 3 3 1 4 1 2 4 4 2 3 1 当然,在数据帧D中可能会出现几种情况 e、 g 我预期的结果是: > expect.D V1 V2 V3 V4 1 1 2 3 4 2 4

我有一个数据帧D:

D=matrix(c(1,4,1,4,2,NA,4,2,3,2,1,3,4,3,2,1),nrow=4,ncol=4)
D<-as.data.frame(D)
> D
  V1 V2 V3 V4
1  1  2  3  4
2  4 NA  2  3
3  1  4  1  2
4  4  2  3  1
当然,在数据帧D中可能会出现几种情况 e、 g

我预期的结果是:

> expect.D
  V1 V2 V3 V4
1  1  2  3  4
2  4  1  2  3
3  4  2  2  3
4  4  3  2  3
5  4  4  2  3
6  1  4  1  2
7  4  2  3  1
   V1 V2 V3 V4
   1  2  3  4
   4  1  1  3
   4  2  1  3
   4  3  1  3
   4  4  1  3
   4  1  2  3
   4  2  2  3
   4  3  2  3
   4  4  2  3
   4  1  3  3
   4  2  3  3
   4  3  3  3
   4  4  3  3
   4  1  4  3
   4  2  4  3
   4  3  4  3
   4  4  4  3
   1  4  1  2
   4  2  3  1

如果我理解正确,您希望将NA扩展为4行,1,2,3,4种可能性各一行。所以一行:1,NA,3,4会变成

1, 1, 3, 4
1, 2, 3, 4
1, 3, 3, 4
1, 4, 3, 4
替换data.frame中的该行

那么像这样的事情可能会:

do.call("rbind",
      lapply(1:nrow(D),
             function(row) {
               if (any(is.na(D[row, ]))) {
                 expand.grid(sapply(D[row, ], function(values) {
                   if (is.na(values)) {
                     1:4
                   } else {
                     values
                   }
                 }))
               } else {
                 D[row, ]
               }
             }))
有些人可能有一个更优雅的解决方案,但它应该可以工作,即使每行有多个NAs

希望能有帮助

:)

您尚未指定要以何种方式展开该行。是否根据
V1
中的数字进行扩展?如果
V1
NA
会发生什么。你真的应该添加一些解释。
do.call("rbind",
      lapply(1:nrow(D),
             function(row) {
               if (any(is.na(D[row, ]))) {
                 expand.grid(sapply(D[row, ], function(values) {
                   if (is.na(values)) {
                     1:4
                   } else {
                     values
                   }
                 }))
               } else {
                 D[row, ]
               }
             }))