如何将NA-s更改为R中的空单元格

use*_*240 0 replace r

我有一个具有不同列数的数据框(取决于我有更少或更多数据点的年份).最初这是一个横截面时间序列长数据集,而不是一个广泛的数据集,但我需要从中提取每年的向量(我想创建国家表).

NA如果我有更少的数据点(这意味着一些结束列具有NA-s),R将s放在行的末尾.

但是我想在不喜欢NAs 的Python代码中使用每一行作为输入向量.所以我想NA用空单元替换s.拥有不同长度的矢量是理想的.NA用零替换s也不起作用,因为我想跟踪不同年份的不同行大小.我找到了人物的答案,但我有数字,任何帮助将不胜感激.目标是编写一个没有NA-s的表或csv文件,因为我想在python代码中传递每一行.
谢谢!

 mat1 <- matrix(c(3,0, 1, 13, NA, NA,NA, 3, 0, 1, 13, 
                  NA, NA, NA, 3, 0 ,1 ,16, NA, NA, NA,
                  3,0, 1, 16, NA, NA, NA, 0, 0, 134, 33, 39, 1, 14,    
                  0,0, 134, 33, 39, 1, 14),7,6)
print(t(mat1))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
 [1,]    3    0    1   13   NA   NA   NA
 [2,]    3    0    1   13   NA   NA   NA
 [3,]    3    0    1   16   NA   NA   NA
 [4,]    3    0    1   16   NA   NA   NA
 [5,]    0    0  134   33   39    1   14
 [6,]    0    0  134   33   39    1   14
Run Code Online (Sandbox Code Playgroud)

作为data.frame:

> print(as.data.frame(t(mat1)))
 >    V1 V2 V3 V4 V5 V6 V7
 > 1  3  0   1 13 NA NA NA
 > 2  3  0   1 13 NA NA NA
 > 3  3  0   1 16 NA NA NA
 > 4  3  0   1 16 NA NA NA
 > 5  0  0 134 33 39  1 14
 > 6  0  0 134 33 39  1 14
Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 5

根据您将行传递给Python代码的方式,有多种方法可以处理这些,但它们都不对应于"清空单元格" - 一个NA值已经(可以说)是最好/最明智的编码方式R中的矩形数组中的空单元格

 mat1 <- matrix(c(3,0, 1, 13, NA, NA,NA, 3, 0, 1, 13, 
              NA, NA, NA, 3, 0 ,1 ,16, NA, NA, NA,
              3,0, 1, 16, NA, NA, NA, 0, 0, 134, 33, 39, 1, 14,    
              0,0, 134, 33, 39, 1, 14),nrow=7,ncol=6)
 mat2 <- t(mat1)  ## see below
 ## Your text description says that `NA` values come at the end
 ## of *rows*, but your  matrix has `NA` values at the end of 
 ## *columns*, so I've transposed the matrix.
Run Code Online (Sandbox Code Playgroud)

既然你声明的目标是

写一个没有NA-s的表或csv文件

正确的答案(正如现在删除的评论所暗示的)是使用write.csv(...,na=""):from ?write.csv,from ,

na:用于数据中缺失值的字符串.

更一般地说,如果您希望一次将一行传递给Python,则可以使用以下策略之一:

  • 用于na.omit()去除NA值:
for (i in 1:nrow(mat2))
    call_my_python_code(na.omit(mat2[i,]))
Run Code Online (Sandbox Code Playgroud)

要么

apply(mat2,1,function(x) call_my_python_code(na.omit(x))
Run Code Online (Sandbox Code Playgroud)
  • 将数据存储为列表,从一开始就将其拆分为一个列表(您仍然必须删除这些NA值):
my_list <- split(mat2,row(mat2))
my_list <- lapply(my_list,na.omit)
lapply(my_list,call_my_python_code)
Run Code Online (Sandbox Code Playgroud)
  • 以长格式存储数据并使用plyrdplyr工具来操作块...
library(reshape2)
mat3 <- na.omit(melt(mat2))
mat3[mat3$Var1==1,]  ## row 1
library(plyr)
dlply(mat3,"Var1",function(x) call_my_python_code(x$value))
Run Code Online (Sandbox Code Playgroud)