我尝试使用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
答案 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