首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不删除整个行/列的情况下忽略df中的所有空单元格?

如何在不删除整个行/列的情况下忽略df中的所有空单元格?
EN

Stack Overflow用户
提问于 2019-09-19 14:23:38
回答 2查看 310关注 0票数 0

我有这样的数据:

我的截图

为了实现这样的目标,我希望忽略/删除所有空单元格,不需要删除整个行或列:

我想要的截图

对于每一列,我希望获得它包含的所有值(在顶部分组),跳过任何空的单元格。我已经尝试过各种tidyverse解决方案(select,filter),但运气并不好--我有x816列,所以我需要一个可以应用于整个df而不是显式命名列的解决方案。

我知道这是不寻常的,而且行中的所有观察通常都是绑定在一起的(例如,每个参与者一行),但是在这个特定的例子中,行信息在列之间是否不同并不重要。

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-19 14:33:55

你可以试试这样的东西

代码语言:javascript
运行
复制
library(tidyverse)
set.seed(1234)


df <- tibble(
  v1 = sample(c(letters[1:4], rep(NA, 20)), 20, replace = TRUE),
  v2 = sample(c(letters[1:4], rep(NA, 20)), 20, replace = TRUE),
  v3 = sample(c(letters[1:4], rep(NA, 20)), 20, replace = TRUE),
  v4 = sample(c(letters[1:4], rep(NA, 20)), 20, replace = TRUE)
)


df %>% 
  fill(names(df)) %>% 
  distinct()

如果您不关心组合体,只想要唯一的值,那么可以这样做:

代码语言:javascript
运行
复制
df %>% 
  gather() %>% 
  distinct(key, value) %>% 
  filter(!is.na(value)) %>% 
  group_by(key) %>% 
  arrange(value) %>% 
  mutate(ord = row_number()) %>% 
  ungroup() %>% 
  spread(key, value)

#   ord v1    v2    v3    v4   
#     1 b     b     b     c    
#     2 d     c     NA    NA   
#     3 NA    d     NA    NA 
票数 0
EN

Stack Overflow用户

发布于 2019-09-19 14:33:03

1)这里的是一个不使用包的单行解决方案。

在每个列上使用na.omit将每个列转换为ts类。然后,cbind将自动处理不同的长度。最后的[TRUE, ]移除ts类。

代码语言:javascript
运行
复制
# test input
DF <- data.frame(V1 = c("a1", NA, "a2"), V2 = c(NA, NA, "a3"), 
   V3 = c("a4", NA, NA), stringsAsFactors = FALSE)

res1 <- do.call("cbind", lapply(DF, function(x) ts(na.omit(x))))[TRUE, ]

给出这个矩阵:

代码语言:javascript
运行
复制
> res1
     V1   V2   V3  
[1,] "a1" "a3" "a4"
[2,] "a2" NA   NA  

如果您喜欢数据帧结果,请使用:

代码语言:javascript
运行
复制
as.data.frame(res1, stringsAsFactors = FALSE)

2) --这是另一种解决方案,它也是一行,不使用包。它省略NA,然后将结果向量扩展到所需的行数。最后,它将其塑造成一个data.frame。

代码语言:javascript
运行
复制
res2 <- replace(DF, TRUE, lapply(DF, function(x) `length<-`(na.omit(x), nrow(DF))))

给这个data.frame:

代码语言:javascript
运行
复制
> res2
    V1   V2   V3
1   a1   a3   a4
2   a2 <NA> <NA>
3 <NA> <NA> <NA>

这一项略有不同,因为它产生的是data.frame而不是矩阵,它使生成的data.frame与输入具有相同的维度。如果您想删除所有NA的行,那么

代码语言:javascript
运行
复制
res2[rowSums(!is.na(res)) > 0, ]
##   V1   V2   V3
## 1 a1   a3   a4
## 2 a2 <NA> <NA>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58013202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档