我有一个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的解决方案都很适合比较。
答案 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
是另一种检查非空字符串的方法,例如!= ""
。我最初使用!
来反转输出并指示空字符串。