使用默认值但不同的值填充R dataframe中的空值

时间:2017-11-05 22:02:01

标签: python r pandas dataframe na

我有一个R数据框,其中一列没有值。我想用不同的值填充这些值。

id  var1   var2   var3
A   25      26     abc
B   28      35     abk
C   55      46      
D   64      az     lft
J   cd      yz      
M   dg      ck     ja
......................
.........

我想用默认但不同的值填充这些空值。

预期产出:

   id  var1   var2   var3
A   25      26     abc
B   28      35     abk
C   55      46     NA1 
D   64      az     lft
J   cd      yz     NA2
M   dg      ck     ja
so now the other null value will be filled with NA3

使用R和pandas的解决方案都很适合比较。

3 个答案:

答案 0 :(得分:3)

R

describe('getArtist function', () => {
    it('should call otherFunction with the right params', () => {
        // how can I get a handle on the mock of otherFunction to see
        // if it was called correctly ?
    });
});

数据

df$var3 = as.character(df$var3)
df$var3 = replace(df$var3, df$var3 == "", paste0(NA, sequence(sum(df$var3 == ""))))
df
#  d var1 var2 var3
#1 A   25   26  abc
#2 B   28   35  abk
#3 C   55   46  NA1
#4 D   64   az  lft
#5 J   cd   yz  NA2
#6 M   dg   ck   ja

答案 1 :(得分:3)

使用data.table,这可以通过

完成
library(data.table)
setDT(DF)[var3 == "", var3 := rowid(var3, prefix = "NA")][]
   id var1 var2 var3
1:  A   25   26  abc
2:  B   28   35  abk
3:  C   55   46  NA1
4:  D   64   az  lft
5:  J   cd   yz  NA2
6:  M   dg   ck   ja

请注意,这适用于没有转换的字符或因子列。赋值运算符:=仅替换DF$var3 的更新元素,即不复制整个数据对象以节省时间和内存。

这可以通过在update语句之前和之后执行address(DF$var3)来验证。 base R solution复制整个data.frame df两次(使用address(df)检查)。

数据

DF <- read.table(fill = TRUE, header = TRUE, 
text = "id  var1   var2   var3
A   25      26     abc
B   28      35     abk
C   55      46      
D   64      az     lft
J   cd      yz      
M   dg      ck     ja")

str(DF)
'data.frame': 6 obs. of  4 variables:
 $ id  : Factor w/ 6 levels "A","B","C","D",..: 1 2 3 4 5 6
 $ var1: Factor w/ 6 levels "25","28","55",..: 1 2 3 4 5 6
 $ var2: Factor w/ 6 levels "26","35","46",..: 1 2 3 4 6 5
 $ var3: Factor w/ 5 levels "","abc","abk",..: 2 3 1 5 1 4

答案 2 :(得分:2)

您还可以使用make.unique填写唯一值。例如,

dat$var3 <- as.character(dat$var3)
dat$var3[!nzchar(dat$var3)] <- make.unique(rep("val", sum(!nzchar(dat$var3))))

返回

dat
  d var1 var2  var3
1 A   25   26   abc
2 B   28   35   abk
3 C   55   46   val
4 D   64   az   lft
5 J   cd   yz val.1
6 M   dg   ck    ja

您可以使用sep参数调整默认分隔符,也可以将任何存根用作基础。我在这里使用了“val”。 nzchar是另一种检查非空字符串的方法,例如!= ""。我最初使用!来反转输出并指示空字符串。