如何在R中使用apply + cat并获得可变宽度结果

时间:2017-05-11 15:51:51

标签: r string

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

采取以下数据设置:

> 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 

2 个答案:

答案 0 :(得分:1)

也许会这样做:

cat(do.call(paste, c(df.play, list(sep = '.'))), sep = '\n')

# a.1
# b.11
# c.111

此外,按行apply会得到固定的结果,因为format会在data.frame转换为带有as.matrix的矩阵时添加额外的间距(see this post )。

答案 1 :(得分:1)

你可以使用sprintf,但不确定你是否想要sprintf解决方案,你只需要输入一个&#34; - &#34;在左对齐的字符总数之前签名,如下所示:

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