【问题标题】:replace NAs with division of two columns用两列的划分替换 NA
【发布时间】:2017-05-31 06:37:07
【问题描述】:

我有一个如下所示的 data.frame:

a   b  c   d
1   2  NA  1
NA  2  2   1 
3   2  NA  1
NA  NA 20  2

我想用 c / d 替换 NA(并删除 cd)看起来像:

a  b
1  2
2  2
3  2
10 10

一些背景:d 是该特定行中NAs 的总和。

我不知道列的名称,所以我尝试了一些变体,例如:

df2[, 1:(length(colnames(df2)) - 2)][is.na(df2[, 1:(length(colnames(df2)) - 2)])] = df2$c / df2$d

但是得到了:

Error in `[<-.data.frame`(`*tmp*`, is.na(df2[, 1:(length(colnames(df2)) -  : 
  'value' is the wrong length

【问题讨论】:

  • 您必须在等号右侧使用与在等号左侧相同的索引 - 您没有指示 which c 和 你想要哪个。
  • 一定是复制粘贴错误。应该是df2$c / df2$d

标签: r dataframe


【解决方案1】:

您可以使用dplyr 执行此操作。


library(dplyr)

df <- tibble(
  a = c(1, NA, 3, NA),
  b = c(2, 2, 2, NA),
  c = c(NA, 2, NA, 20L),
  d = c(1, 1, 1, 2)
)

df %>% 
  mutate_at(vars(-c, -d), funs(if_else(is.na(.), c / d, .))) %>% 
  select(-c, -d)

#> # A tibble: 4 x 2
#>       a     b
#>   <dbl> <dbl>
#> 1     1     2
#> 2     2     2
#> 3     3     2
#> 4    10    10

您可以使用?dplyr::select_helpers 中的任何函数在vars() 调用中指定变量。这些可以是正则表达式,一个简单的名称向量,或者您可以只使用除cd 之外的所有列(因为我已经将这个示例更改为现在)。

【讨论】:

  • 唯一的问题是我不知道列名,除了cd
  • 您好,我添加了不依赖于您是否知道列名的解决方案!
  • 在哪里? vars(a, b) 不是指ab 列吗?我可以补充一下,我也不知道有多少列。
  • @RafaelMartins 我更新了示例,因此您无需提前知道变量名称。您可以使用除cd 之外的所有内容
【解决方案2】:
library(data.table)
data<-fread("a   b  c   d
1   2  NA  1
            NA  2  2   1 
            3   2  NA  1
            NA  NA 20  2")
names_to_loop<-names(data)
names_to_loop<-names_to_loop[names_to_loop!="c"&names_to_loop!="d"]
for (ntl in names_to_loop){
  set(data,j=ntl,value=ifelse(is.na(data[[ntl]]),data[["c"]]/data[["d"]],data[[ntl]]))
}
data[,c:=NULL]
data[,d:=NULL]
> data
    a  b
1:  1  2
2:  2  2
3:  3  2
4: 10 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2018-10-14
    • 2022-06-16
    • 2015-12-20
    • 2018-08-08
    • 2020-07-01
    • 2019-11-05
    • 2016-12-31
    相关资源
    最近更新 更多