我有一个非常简单的问题。但是,我所能找到的都是非常复杂的答案,并不能完全满足我的需要。
最接近的是,我在这里找到:
但是,我想另外指定如何基于不同列中的值来处理指定列中的NA。
我有一个data.table,其中有带有NA的列,其中fac
是一个因子变量。
df <- fread(
"A B C fac H I J iso year matchcode
0 1 1 NA 0 1 0 NLD 2009 NLD2009
1 0 0 NA 1 0 1 NLD 2014 NLD2014
0 0 0 B 1 0 0 AUS 2011 AUS2011
1 0 1 B 0 1 0 AUS 2007 AUS2007
0 1 0 NA 0 1 1 USA 2007 USA2007
0 0 1 NA 0 0 1 USA 2011 USA2010
0 1 0 NA 0 0 0 USA 2013 USA2013
1 0 1 A 0 1 0 BLG 2007 BLG2007
0 1 0 A 1 0 1 BEL 2009 BEL2009
1 0 1 A 0 1 0 BEL 2012 BEL2012",
header = TRUE
)
我想做的就是根据中的值分配值D
和E
NA中的NAfac
值iso3c
。所以,当iso3c == NLD
时,NA在fac
应改为D
当iso3c == USA
该NA在fac
应改为E
,导致以下结果。
df <- fread(
"A B C fac H I J iso year matchcode
0 1 1 D 0 1 0 NLD 2009 NLD2009
1 0 0 D 1 0 1 NLD 2014 NLD2014
0 0 0 B 1 0 0 AUS 2011 AUS2011
1 0 1 B 0 1 0 AUS 2007 AUS2007
0 1 0 E 0 1 1 USA 2007 USA2007
0 0 1 E 0 0 1 USA 2011 USA2010
0 1 0 E 0 0 0 USA 2013 USA2013
1 0 1 A 0 1 0 BLG 2007 BLG2007
0 1 0 A 1 0 1 BEL 2009 BEL2009
1 0 1 A 0 1 0 BEL 2012 BEL2012",
header = TRUE
)
编辑:这fac
是一个因素变量的事实给了一些问题。有效的方法如下:
df$fac<- as.character(df$fac)
df[, fac:= ifelse(is.na(fac) & iso3c == "NLD", "D",
ifelse(is.na(fac) & iso3c == "USA", "E", wbgroup))][]
df[, fac:= factor(fac, levels = c(levels(fac), c('A', 'B', 'C', 'D', 'E', 'F', 'G')))]
我们需要在中指定逻辑条件i
并进行分配。由于只有两种情况可以更改值,因此可以分两步完成
df[is.na(fac) & iso == 'NLD', fac := 'D'
][is.na(fac) & iso == 'USA', fac := 'E'][]
# A B C fac H I J iso year matchcode
# 1: 0 1 1 D 0 1 0 NLD 2009 NLD2009
# 2: 1 0 0 D 1 0 1 NLD 2014 NLD2014
# 3: 0 0 0 B 1 0 0 AUS 2011 AUS2011
# 4: 1 0 1 B 0 1 0 AUS 2007 AUS2007
# 5: 0 1 0 E 0 1 1 USA 2007 USA2007
# 6: 0 0 1 E 0 0 1 USA 2011 USA2010
# 7: 0 1 0 E 0 0 0 USA 2013 USA2013
# 8: 1 0 1 A 0 1 0 BLG 2007 BLG2007
# 9: 0 1 0 A 1 0 1 BEL 2009 BEL2009
#10: 1 0 1 A 0 1 0 BEL 2012 BEL2012
如果要替换的值很多,请使用键/值数据集进行联接并进行赋值
df[data.table(fac = NA_character_, iso = c('NLD', 'USA'),
val = c('D', 'E')), fac := val, on = .(fac, iso)]
注:本栏目fac
,iso
是character
一流的。如果fac
是一个factor
类,并且levels
列中不存在“ D”,“ E” ,则levels
在执行赋值之前创建新的类,即
df[, fac := factor(fac, levels = c(levels(fac), c('D', 'E')))]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句