当前位置: 首页 > 知识库问答 >
问题:

基于另一列中的值用预定值替换一列中的NA

杨曜瑞
2023-03-14

我有一个非常简单的问题。然而,我所能找到的都是非常复杂的答案,并不完全符合我的需求。

最接近的,我在这里发现:

弗洛德尔和埃迪的回答(data.table)

但是,我想额外指定如何根据不同列中的值处理指定列中的NA。

我有一个data.table,其中包含NA列,其中< code>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
)

我想做的是根据< code>iso3c中的值将值< code>D和< code>E分配给< code>fac列中的NA。因此,当< code>iso3c == NLD时,< code>fac中的NA应替换为< code>D,当< code>iso3c ==美国时,< code>fac中的NA应替换为< code>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')))]

共有2个答案

董俊晖
2023-03-14

另一个选项使用data.table和两个ifelse语句。

library(data.table)

df[, fac := ifelse(is.na(fac) & iso == "NLD", "D", 
                   ifelse(is.na(fac) & iso == "USA", "E", fac))][]
#     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
丌官凯康
2023-03-14

我们需要在 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)]

注:列faciso字符class。如果fac是一个因子类,并且列中不存在“D”、“E”和级别,则在执行赋值之前创建新的级。

df[, fac := factor(fac, levels = c(levels(fac), c('D', 'E')))]

 类似资料:
  • 问题内容: 我想用相邻列中的值替换一列中的空值,例如,如果我有 我希望它是: 尝试过 但是没用,它说值应该是浮点数,整数,长整数,字符串或字典 有任何想法吗? 问题答案: 最后找到一个替代方案:

  • 用其他dataframe的列值替换dataframe的一列中的nan值时出现问题。下面是一个测试示例: 我想用其他dataframe中的特定值替换列名中的Nan值(如果其中有一些Nan值,则不是其他列),例如此dataframe中的Name2值: 我想得到的是: 这是此示例的测试代码: 然后我尝试了这三种方法,但都不起作用——我的数据帧始终保持Nan值。 你能告诉我哪里出错了吗?

  • 问题内容: 我有一个这样的Pandas DataFrame: 我只想在值等于0的情况下用第二列()中的值替换值,然后(对于剩余的零值),再次使用第三列()进行替换。期望的结果是下一个: 我使用该函数完成了此操作,但它似乎太慢了。我认为这一定是一种更快的方法。 使用其他功能而不是该功能,有没有更快的方法呢? 问题答案: 使用起来更快。使用与您使用类似的模式: 但是,使用嵌套稍微快一点: 时机 使用以

  • 问题内容: 可以说我在某张桌子上有很多选择。列的一个值是使用复数logc及其称为 ColumnA 来计算的。现在,对于另一列,我需要 ColumnA中 的值,并向其中添加一些其他静态值。 示例SQL: 在 [ColumnA] + 10 是什么即时寻找。复杂的东西是一个巨大的案例/当块。 有想法吗? 问题答案: 如果要引用该子句中计算出的值,则需要将现有查询移到子SELECT中: 即使您不打算使用该

  • 我想将数据帧列中的一个值替换为另一个值,我必须对许多列执行此操作(假设30/100列) 我已经经历过这个和这个了。 我可以在y列和z列中分别用Null替换“baz”。但我想对所有列都这样做——类似于下面的列表理解方式

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何