我有一个如下所示的数据框,其中包含一些Nas:

mydf=data.frame(ID=LETTERS[1:10], aaa=runif(10), bbb=runif(10), ccc=runif(10), ddd=runif(10))
mydf[c(1,4,5,7:10),2]=NA
mydf[c(1,2,4:8),3]=NA
mydf[c(3,4,6:10),4]=NA
mydf[c(1,3,4,6,9,10),5]=NA

> mydf
   ID       aaa       bbb        ccc       ddd
1   A        NA        NA 0.08844614        NA
2   B 0.4912790        NA 0.88925139 0.1233173
3   C 0.1325188 0.1389260         NA        NA
4   D        NA        NA         NA        NA
5   E        NA        NA 0.60750723 0.6357998
6   F 0.8218579        NA         NA        NA
7   G        NA        NA         NA 0.5988206
8   H        NA        NA         NA 0.4008338
9   I        NA 0.8784563         NA        NA
10  J        NA 0.2959320         NA        NA

我想在这里实现以下几点:

1-将非NA值替换为column index -1,使输出如下所示:

> mydf
   ID       aaa       bbb        ccc       ddd
1   A        NA        NA          3        NA
2   B         1        NA          3         4
3   C         1         2         NA        NA
4   D        NA        NA         NA        NA
5   E        NA        NA          3         4
6   F         1        NA         NA        NA
7   G        NA        NA         NA         4
8   H        NA        NA         NA         4
9   I        NA         2         NA        NA
10  J        NA         2         NA        NA

2-然后我想增加一个额外的专栏,显示以下内容:

  • 0表示一行中的所有NAS
  • 0表示具有1个以上非NA值的行
  • 当它是一行中唯一的非NA值时的实际值

最终结果应该如下所示:

> mydf
   ID       aaa       bbb        ccc       ddd       final
1   A        NA        NA          3        NA           3
2   B         1        NA          3         4           0
3   C         1         2         NA        NA           0
4   D        NA        NA         NA        NA           0
5   E        NA        NA          3         4           0
6   F         1        NA         NA        NA           1
7   G        NA        NA         NA         4           4
8   H        NA        NA         NA         4           4
9   I        NA         2         NA        NA           2
10  J        NA         2         NA        NA           2

我可以用一个难看的for循环来完成这一切,然后用aggregate代替最后一列,并在适当的地方用0替换……

但我想知道是否有一种干净利落的方法来做到这一点,在短短几条线路上打出大约apply个电话...

谢谢!

推荐答案

您可以执行以下操作:

mydf[-1] <- sapply(1:4, \(x) x * mydf[x+1]/mydf[x+1])

mydf$final <- apply(mydf[-1], 1, function(x) { 
  if(all(is.na(x)) | sum(!is.na(x)) > 1) 0 else na.omit(x)
})

结果:

mydf
#>    ID aaa bbb ccc ddd final
#> 1   A  NA  NA   3  NA     3
#> 2   B   1  NA   3   4     0
#> 3   C   1   2  NA  NA     0
#> 4   D  NA  NA  NA  NA     0
#> 5   E  NA  NA   3   4     0
#> 6   F   1  NA  NA  NA     1
#> 7   G  NA  NA  NA   4     4
#> 8   H  NA  NA  NA   4     4
#> 9   I  NA   2  NA  NA     2
#> 10  J  NA   2  NA  NA     2

创建于2022-12-16年第reprex v2.0.2

R相关问答推荐

当月份额减go 当月份额

Data.table';S GForce-将多个函数应用于多列(带可选参数)

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

函数可以跨多个列搜索多个字符串并创建二进制输出变量

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

计算Mean by分组和绑定到R中的数据集

按两个因素将观测值分组后计算单独的百分比

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

如何创建直方图与对齐的每月箱?

在R中,如果一个值在同一数据帧中的任何特定列中,如何计算?

R Bupar:获取每个 case 的踪迹

当执行一个比下游react 链慢的耗时的函数时,如何防止shiny 的react 对象反弹?

修改gratia包(R)中compare_smooths函数的绘图

从txt文件中删除前n行

有没有一种方法可以基于两个条件和现有的时间变量来创建时间值?

保存GggPlot对象以在不同数据集上使用

如何将嵌入的情节设计为伪迷你图?

长而宽的格式练习