首页 > 解决方案 > 如何删除空单元格并减少列

问题描述

我有一张桌子,大致如下:

| variable | observer1 | observer2 | observer3 | final | 
| -------- | --------- | --------- | --------- | ----- |
| case1    |           |           |           |       |
| var1     | 1         | 1         |           |       |
| var2     | 3         | 3         |           |       |
| var3     | 4         | 5         |           | 5     |
| case2    |           |           |           |       |
| var1     | 2         |           | 2         |       |
| var2     | 5         |           | 5         |       |
| var3     | 1         |           | 1         |       |
| case3    |           |           |           |       |
| var1     |           | 2         | 3         | 2     |
| var2     |           | 2         | 2         |       |
| var3     |           | 1         | 1         |       |
| case4    |           |           |           |       |
| var1     | 1         |           | 1         |       |
| var2     | 5         |           | 5         |       |
| var3     | 3         |           | 3         |       |

观察者的三个列,但只有两个被填充。首先,我想计算 IRR,所以我需要一个有两列没有空单元格的表,如下所示:

| variable | observer1 | observer2 |
| -------- | --------- | --------- |
| case1    |           |           |
| var1     | 1         | 1         |
| var2     | 3         | 3         |
| var3     | 4         | 5         |
| case2    |           |           |
| var1     | 2         | 2         |
| var2     | 5         | 5         |
| var3     | 1         | 1         |
| case3    |           |           |
| var1     | 2         | 3         |
| var2     | 2         | 2         |
| var3     | 1         | 1         |
| case4    |           |           |
| var1     | 1         | 1         |
| var2     | 5         | 5         |
| var3     | 3         | 3         |

我尝试使用 tidyverse 包,但我不确定。一些“ifelse()”魔法可能更容易。有没有一种干净简单的方法来做这样的事情?有人可以指出我要使用的正确功能吗?或者只是在stackoverflow上搜索一个关键字?我发现了很多方法来删除整个空列或行。

编辑:我删除了原始数据的链接。这是不必要的。感谢 Lamia 的工作回答。

标签: rdplyr

解决方案


在您的 3 列observer1observer2observer3,有时您有 2 个非NA值、1 个非NA值或 3 个NA值。如果你想合并你的 3 列,你可以这样做:

res = data.frame(df$coding,t(apply(df[paste0("observer",1:3)],1,function(x) x[!is.na(x)][1:2])))

如果有 2 个,该apply函数将为每一行返回 2个非值,如果只有一个值,则返回一个非值和一个,如果行中没有数据,则返回两个 s。然后,我们将此结果放入具有第一列 ( ) 的数据框中。NANANANAcoding


推荐阅读