2017-05-11 17 views
1

私は別のプログラムで使用するためにカスタムファッションでいくつかのデータを印刷するためにRを使用しようとしています。それは私の数字を左パッドにしようとし続け、私はそれを止めることはできません。私は形式、印刷物、猫、などで何かを見つけることができませんでした。私の問題を解決するまた、固定幅や可変幅を検索すると、多少異なる問題を解決しようとする人々(そして、パディングのスタイルを変更する - それを削除するのではなく)が求められます。Rでapply + 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 

答えて

1

多分これはそれを行います。また

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

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

as.matrixsee this post)と行列にdata.frame変換時formatは余分なスペースを追加するため、行によってapply結果で固定与えます。

1

、あなただけ配置する必要がありますが、あなたががsprintfのソリューションを望んでいたではないことを確認sprintfを、使用することができます - 、左揃えを行い、以下のようにして文字の合計数の前に記号を「」:

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

あるいは卑GSUBと解決策:

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

それとも、そして、我々はまた、団結することができますpaste0したくない場合は、

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 
関連する問題