【问题标题】:Remove Multiple Empty Columns for String [duplicate]删除字符串的多个空列[重复]
【发布时间】:2019-09-06 01:22:24
【问题描述】:

我有一个如下所示的数据表:

old1   old2   old3   old4
aaa           ccc
aaa    bbb     
       bbb    ccc    ddd    

我想删除空列以获得如下内容:

new1  new2   new3   
aaa   ccc
aaa   bbb     
bbb   ccc    ddd   

我尝试了以下对我不起作用的方法:

df[, colSums(df!= "") != ""]
df[!sapply(df, function (x) all(is.na(x) | x == ""))]
Filter(function(x) !(all(x==""|x==0)), df) 

【问题讨论】:

  • @thelatemail 几乎相似,但我不确定这是否完全是骗局,因为最终输出中的列数与初始输入不同。此外,您能否针对此示例调整该链接中的任何解决方案?
  • @RonakShah - 如果您不同意,请随时重新打开。在我看来,这两个问题的输入和输出集实际上是相同的。我不确定删除一列是否会使它变得足够不同,但我明白你的意思。

标签: r string character


【解决方案1】:

使用基本 R apply 的一个选项是首先计算将出现在最终数据帧 (cols) 中的列数。从每一行过滤空值并使用rep插入空值。

cols <- max(rowSums(df != ""))

as.data.frame(t(apply(df, 1, function(x) {
   vals <- x[x != ""]
   c(vals, rep("", cols - length(vals)))
})))

#   V1  V2  V3
#1 aaa ccc    
#2 aaa bbb    
#3 bbb ccc ddd

gather/spread 的另一个选项是为行号添加一个新列,使用 gatherfilter 非空值、group_byrow 和使用paste0 提供新的列名,最后使用spread 将其转换为宽格式。

library(dplyr)
library(tidyr)

df %>%
  mutate(row = row_number()) %>%
  gather(key, value, -row) %>%
  filter(value != "") %>%
  group_by(row) %>%
  mutate(key = paste0("new", row_number())) %>%
  spread(key, value, fill = "") %>%
  ungroup() %>%
  select(-row)

#  new1  new2  new3 
#  <chr> <chr> <chr>
#1 aaa   ccc   ""   
#2 aaa   bbb   ""   
#3 bbb   ccc   ddd  

【讨论】:

  • 感谢@Ronak Shah。我已经尝试过您与我的实际大数据共享的解决方案并且正在运行。只是我有这个错误消息:“警告消息:度量变量的属性不相同;它们将被删除”我认为这可能是由于新列(行号)的虚拟索引?
  • @CHONG 这是一条警告消息(不是错误),但我不知道为什么。也许您的数据中有NAs 或将某些列作为因素?
  • 是的@Ronak Shah。使用 str(df) - 我可以看到我的所有列都是因子。
  • 所以你可以把它转换成字符然后继续剩下的链df %&gt;% mutate_all(as.character) %&gt;% mutate(row = row_number()) %&gt;% gather(key, value, -row).....
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多