R语言 如何对常数进行条件行插补

v09wglhw  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(81)

我是一个R新手,正在努力为看似简单的逻辑编写代码,并将感谢任何帮助!我尝试为数据集中的每一行中的NA单元格输入常数值1,但仅适用于具有2个或更少NA单元格的行。最后,我还将计算一个新的列,在插补之后使用行方式平均值。如果一行代码就能自动实现所有这些功能,那就太好了!
下面是一个要使用的示例数据集。

tData <- data.frame(subID=c(1001,1002,1003,1004),
b1=c(1,1,2,NA),
b2=c(NA,1,1,NA),
b3=c(NA,2,2,NA),
b4=c(2,NA,1,NA))

字符串
我一直在看各种base和dplyr代码示例,但我骑的斗争巴士。

vuktfyat

vuktfyat1#

您可以在这两行中执行此操作。

tData[is.na(tData) & rowSums(is.na(tData)) <= 2] <- 1
tData |> cbind(row_means=rowMeans(tData[-1]))
#   subID b1 b2 b3 b4 row_means
# 1  1001  1  1  1  2      1.25
# 2  1002  1  1  2  1      1.25
# 3  1003  2  1  2  1      1.50
# 4  1004 NA NA NA NA        NA

字符串

  • 数据:*
tData <- structure(list(subID = c(1001, 1002, 1003, 1004), b1 = c(1, 1, 
2, NA), b2 = c(NA, 1, 1, NA), b3 = c(NA, 2, 2, NA), b4 = c(2, 
NA, 1, NA)), class = "data.frame", row.names = c(NA, -4L))

xkrw2x1b

xkrw2x1b2#

我们可以这样做:

library(dplyr)

tData %>% 
  mutate(across(-subID, ~ifelse(rowSums(is.na(tData[2:5])) <= 2 & is.na(.), 1, .))) %>%
  rowwise() %>%
  mutate(mean_value = mean(c_across(-subID), na.rm = TRUE))
subID    b1    b2    b3    b4 mean_value
  <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>
1  1001     1     1     1     2       1.25
2  1002     1     1     2     1       1.25
3  1003     2     1     2     1       1.5 
4  1004    NA    NA    NA    NA     NaN

相关问题