使用默认但不同的值填充 R 数据框中的空值

Fill the null values in R dataframe with default but distinct values

我有一个 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 两者都很好比较。

R

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

数据

df = structure(list(d = c("A", "B", "C", "D", "J", "M"), var1 = c("25", 
"28", "55", "64", "cd", "dg"), var2 = c("26", "35", "46", "az", 
"yz", "ck"), var3 = structure(c(2L, 3L, 1L, 5L, 1L, 4L), .Label = c("", 
"abc", "abk", "ja", "lft"), class = "factor")), .Names = c("d", 
"var1", "var2", "var3"), row.names = c(NA, -6L), class = "data.frame")

对于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 的更新元素 ,即不复制整个数据对象以节省时间和内存。

这可以通过在更新语句前后执行address(DF$var3)来验证。 复制整个 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

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

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

returns

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 是另一种检查非空字符串的方法,如 != ""。我最初使用 ! 来反转输出并指示空字符串。