Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 限制数据帧中所有单元格的字符串长度?_R_Dplyr - Fatal编程技术网

R 限制数据帧中所有单元格的字符串长度?

R 限制数据帧中所有单元格的字符串长度?,r,dplyr,R,Dplyr,嗨,有没有一种方法可以限制data.frame中所有列的字符串文本大小,而不必循环遍历每一列,并且一次只使用一列?例如,在下面的数据框中,我可以将所有文本大小限制为仅5个字符,而不必一次执行一列。如果这有50列,一次截断一列是很困难的 g1 = data.frame ( gene = c( "aaaaaaa","aaaaaaa","aaaaaaaaaaaa","a","bbbbbbbbbbbbbbbb

嗨,有没有一种方法可以限制data.frame中所有列的字符串文本大小,而不必循环遍历每一列,并且一次只使用一列?例如,在下面的数据框中,我可以将所有文本大小限制为仅5个字符,而不必一次执行一列。如果这有50列,一次截断一列是很困难的

g1 = data.frame ( 
  gene = c( "aaaaaaa","aaaaaaa","aaaaaaaaaaaa","a","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"),
  value = c("1fdfdfdsfdsfdsfds","2fdfdfdfdsfds00","fdfdfds3","5ffffffffffff","0")
)
我试过这样的方法,但失败了。lapplyg1,Stru_trunc,5

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

谢谢。

您可以使用substr或substring:

可以使用substr或substring:

在OP的代码中,str_trunc默认使用省略号=。。。。如果我们把它改为空白,它应该给出与上面相同的输出。lappy的输出是一个列表,因此我们可以将其分配回data.frame或wrap with data.frame以将列表转换为data.frame

或者使用tidyverse

如果OP的代码中有一个dplyr版本,str_trunc默认使用省略号=。。。。如果我们把它改为空白,它应该给出与上面相同的输出。lappy的输出是一个列表,因此我们可以将其分配回data.frame或wrap with data.frame以将列表转换为data.frame

或者使用tidyverse


如果我们有一个dplyr版本Base R匿名函数,将因子类型强制到字符,以便应用子字符串函数:

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

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

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

你的期望是什么ouptut@akrun预期所有字符串仅限于5个字符。抱歉,将更新以使其更清楚。lapply命令会这样做吗?或者str_truncas.matrixg1,5I对宽度小于5的某些元素有疑问。你想保持原样还是用什么东西填满它?这只是为了展示吗?你的期望是什么ouptut@akrun预期所有字符串仅限于5个字符。抱歉,将更新以使其更清楚。lapply命令会这样做吗?或者str_truncas.matrixg1,5I对宽度小于5的某些元素有疑问。你想保持原样还是用什么东西填满它?这只是为了显示吗?跨越是一个有趣的功能!看起来我只有版本:dplyr_0.8.5。然而,第一种解决方案是有效的。再次感谢!这是一个有趣的功能!看起来我只有版本:dplyr_0.8.5。然而,第一种解决方案是有效的。再次感谢!你所做的是不必要的。子字符串函数所做的第一件事是使用as.character转换输入。@A5C1D2H2I1M1N2O1R2T1谢谢,我不知道:!以上编辑!你所做的是不必要的。子字符串函数所做的第一件事是使用as.character转换输入。@A5C1D2H2I1M1N2O1R2T1谢谢,我不知道:!以上编辑!
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
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
g1 %>%
    mutate_all(str_sub, 1, 5)
data.frame(lapply(g1, function(x){
      if(is.character(x) | is.factor(x)){
       x <- substring(x, 1, 5)
      }else{
        x
      }
    }
  )
)