【问题标题】:Limit string length of all cells in a dataframe?限制数据框中所有单元格的字符串长度?
【发布时间】:2020-07-05 15:24:30
【问题描述】:

嗨,有没有一种方法可以限制 data.frame 中所有列的字符串文本大小,而不必遍历每一列并一次使用 str_trunc 之类的东西?例如下面的数据框,我可以将所有文本大小限制为 5 个字符,而不必一次处理一列。如果这有 50 列,一次截断一列会很困难。

g1 = data.frame ( 
  gene = c( "aaaaaaa","aaaaaaa","aaaaaaaaaaaa","a","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"),
  value = c("1fdfdfdsfdsfdsfds","2fdfdfdfdsfds00","fdfdfds3","5ffffffffffff","0")
)

我尝试了类似的方法但失败了。 lapply(g1, str_trunc, 5)

如果我可以一口气将数据框中的任何字符串限制为 5 个字符,那就太好了。所以例如第一个单元格,第 1 行,第 1 列将只是 aaaaa

谢谢。

【问题讨论】:

  • 你的预期输出是什么
  • @akrun 预计所有字符串仅限于 5 个字符。抱歉将更新以使其更清晰。
  • lapply 命令会这样吗?或str_trunc(as.matrix(g1), 5)
  • 我对一些宽度小于 5 的元素有疑问。你想保持原样还是填充一些东西?
  • 这只是为了展示目的吗?

标签: r dplyr


【解决方案1】:

在 OP 的代码中,str_trunc 默认使用ellipsis = "..."。如果我们将其更改为空白 (""),它应该给出与上面相同的输出。 lapply 的输出是list,因此我们可以将其分配回data.frame 或用data.frame 包装,将list 转换为data.frame

library(stringr)
g1[] <- lapply(g1, str_trunc, 5, ellipsis = "")
g1
#   gene value
#1 aaaaa 1fdfd
#2 aaaaa 2fdfd
#3 aaaaa fdfdf
#4     a 5ffff
#5 bbbbb     0

或者我们可以通过将data.frame 转换为matrix 来使用base R,然后使用base R 中的substr 而无需循环

g1[] <- substr(as.matrix(g1), 1, 5)
g1
#   gene value
#1 aaaaa 1fdfd
#2 aaaaa 2fdfd
#3 aaaaa fdfdf
#4     a 5ffff
#5 bbbbb     0

或使用tidyverse

library(dplyr) #1.0.0
library(stringr)
g1 %>%  
      mutate(across(everything(), str_sub, 1, 5))
#   gene value
#1 aaaaa 1fdfd
#2 aaaaa 2fdfd
#3 aaaaa fdfdf
#4     a 5ffff
#5 bbbbb     0

如果我们有一个dplyr 版本&lt; 1.0.0,一个选项是mutate_all

g1 %>%
    mutate_all(str_sub, 1, 5)

【讨论】:

  • 交叉是一个有趣的功能!看起来我只有版本:dplyr_0.8.5。然而,第一个解决方案有效。再次感谢!
【解决方案2】:

您可以使用substrsubstring

g1[] <- lapply(g1, substr, 1, 5)
#OR
#g1[] <- lapply(g1, substring, 1, 5)
g1
#   gene value
#1 aaaaa 1fdfd
#2 aaaaa 2fdfd
#3 aaaaa fdfdf
#4     a 5ffff
#5 bbbbb     0

【讨论】:

  • 但结果是列表而不是数据框
【解决方案3】:

Base R 匿名函数将因子类型强制转换为字符以便应用子字符串函数:

data.frame(lapply(g1, function(x){
      if(is.character(x) | is.factor(x)){
       x <- substring(x, 1, 5)
      }else{
        x
      }
    }
  )
)

【讨论】:

  • 你所做的一切都是不必要的。 substring 函数所做的第一件事是使用 as.character 转换输入。
  • @A5C1D2H2I1M1N2O1R2T1 谢谢我不知道 :) !以上编辑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多