我有一个数据框,其中对于每一行,我想随机抽样三列(其中三列可以因行而异),并取这三个采样值的平均值.作为一个额外的问题,我有许多行完全是NA的(由于其他原因,我不能删除它们),或者只包含1到2个非NA值.基于this question and answer分,我try 了以下几种方法:

df_new <- df %>%
  rowwise %>%
  mutate(inflo_mean = mean(sample(na.omit(c_across(everything())), 3)))

这不起作用,我得到一个关于使用sample()的错误:

Error in `mutate()`:
ℹ In argument: `inflo_mean = mean(sample(na.omit(c_across(everything())), 3))`.
ℹ In row 1.
Caused by error in `sample.int()`:
! invalid first argument

然后我试着把它分解成更小的步骤,分别处理不同的NA病例,并得出以下结论:

df_new2 <- df %>%
  rowwise() %>%
  mutate(num_NAs = sum(!is.na(across(starts_with("Col_")))),
         v_inflo = list(na.omit(c_across((starts_with("Col_"))))),
         inflo_mean = case_when(num_NAs > 2 ~ mean(sample(v_inflo, 3)),
                                  num_NAs == 2 ~ mean(v_inflo),
                                  num_NAs == 1 ~ as.numeric(v_inflo),
                                  num_NAs == 0 ~ NA_real_,
                                  TRUE ~ NA_real_))

同样,这也不起作用,我得到了相同的错误.我判断了列的数据类型,它们都是整数.这可能是什么问题呢?或者还有其他解决方案吗?

示例数据:

> dput(df)
structure(list(Col_1 = c(NA, 77L, 82L, 172L), Col_2 = c(NA, 79L, 
NA, 135L), Col_3 = c(NA, 81L, NA, 131L), Col_4 = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), Col_5 = c(NA, NA, NA, 
33L), Col_6 = c(NA, NA, NA, 104L), Col_7 = c(NA, NA, NA, 106L
), Col_8 = c(NA, NA, NA, 93L), Col_9 = c(NA, NA, NA, 50L), Col_10 = c(NA, 
NA, NA, 48L), Col_11 = c(NA, NA, NA, 96L), Col_12 = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), Col_13 = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), Col_14 = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_), Col_15 = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -4L))

推荐答案

你可以使用mapply,如下所示

df$inflo_mean <-
  mapply(
    \(x, k) mean(na.omit(c(x))[sample.int(sum(!is.na(x)), k)]),
    asplit(df, 1),
    pmin(rowSums(!is.na(df)), 3)
  )

你会看到的

> print(as.data.frame(df))
  Col_1 Col_2 Col_3 Col_4 Col_5 Col_6 Col_7 Col_8 Col_9 Col_10 Col_11 Col_12
1    NA    NA    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA
2    77    79    81    NA    NA    NA    NA    NA    NA     NA     NA     NA
3    82    NA    NA    NA    NA    NA    NA    NA    NA     NA     NA     NA
4   172   135   131    NA    33   104   106    93    50     48     96     NA
  Col_13 Col_14 Col_15 inflo_mean
1     NA     NA     NA        NaN
2     NA     NA     NA   79.00000
3     NA     NA     NA   82.00000
4     NA     NA     NA   85.66667

R相关问答推荐

无法在我的情节中表现出显着的差异

R中具有gggplot 2的Likert图,具有不同的排名水平和显示百分比

用值序列对行进行子集化,并标识序列开始的列

S用事件解决物质平衡问题

计算时间段的ECDF(R)

条形图和在Ploly中悬停的问题

多个过滤器内的一个盒子在仪表板Quarto

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

使用rvest从多个页面抓取时避免404错误

有没有可能用shiny 的书签恢复手风琴面板?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

如何使用FormC使简单算术运算得到的数字是正确的?

在ggplot2上从多个数据框创建复杂的自定义图形

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

使用dqur在不同变量上创建具有多个条件的变量

删除r中每个因素级别的最后2行

使用dplyr删除具有条件的行

创建由三个单独的shapefile组成的单个 map

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出