【问题标题】:How to use apply + cat in R and get a variable width result如何在 R 中使用 apply + cat 并获得可变宽度结果
【发布时间】:2017-05-11 15:51:51
【问题描述】:

我正在尝试使用 R 以自定义方式打印一些数据,以便在单独的程序中使用。它一直试图留下我的号码,我无法让它停下来。我无法找到 ?format、?print、?cat、?etc 中的任何内容。完全解决我的问题。此外,搜索固定宽度或可变宽度会导致人们希望解决一些不同的问题(并且大多数人希望更改填充样式——而不是删除它)。

进行以下数据设置:

> df.play <- data.frame(name = c('a','b','c'), value = c(1,11,111))

> df.play
  name value
1    a     1
2    b    11
3    c   111

这是我想要的输出

#Goal
> for (j in seq(nrow(df.play))) {cat(as.character(df.play[j,1]),'.',df.play[j,2],'\n',sep='')}
a.1
b.11
c.111

如何在不显式循环的情况下获得这种输出格式(最好避免使用外部库)?

#Naive Attempt 1
#    Why does it left pad the second "column"?
#    How do I get it to stop?
#    Why does cat even parse it as a column to begin with?
junk<-apply(df.play,1,function(x) cat(x[1],'.',x[2],'\n',sep=''))
a.  1
b. 11
c.111

#Naive Attempt 2
#    Perhaps this will help provide some insight.
#    The number is a string before it gets to cat. Why?
t<-apply(df.play,1,function(x) cat(x[1],'.',sprintf('%d',x[2]),'\n',sep=''))
 Error in sprintf("%d", x[2]) : 
  invalid format '%d'; use format %s for character objects 

【问题讨论】:

    标签: r string


    【解决方案1】:

    也许这样就可以了:

    cat(do.call(paste, c(df.play, list(sep = '.'))), sep = '\n')
    
    # a.1
    # b.11
    # c.111
    

    此外,apply by row 将给出固定的结果,因为format 将在将data.frame 转换为带有as.matrix (see this post) 的矩阵时添加额外的间距。

    【讨论】:

      【解决方案2】:

      您可以使用sprintf,但不确定您是否需要 sprintf 解决方案,您只需要在字符总数之前放置一个“-”号即可左对齐,如下所示:

      data.frame(value=sprintf("%-5s",paste0(df.play$name,".",df.play$value)))
      

      或使用 gsub 的 BaseR 解决方案:

      df <- data.frame(value =gsub("\\s+","",apply(df.play,1,paste0,collapse=".")))
      data.frame(value1=sprintf("%-5s",df$value))
      

      或者如果你不想粘贴0,那么我们也可以联合起来,

      df <- tidyr::unite(df.play,value,1:2,sep=".")
      data.frame(value1=sprintf("%-5s",df$value))
      

      输出

      value
      1 a.1  
      2 b.11 
      3 c.111
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-24
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-14
        • 2023-02-06
        • 2021-04-25
        相关资源
        最近更新 更多