2

スペースで区切られた別のプログラムの入力ファイルを作成しようとしています。複数の列の内容を一緒に貼り付けていますが、R のデフォルトの右揃えのように見えるため、数値の長さが異なる場合に問題が発生します。たとえば、次のようになります。

row_id       monthly_spend
 123            4.55
 567           24.64
 678          123.09

になります:

row_id:123 monthly_spend:  4.55
row_id:567 monthly_spend: 24.64
row_id:678 monthly_spend:123.09

私が必要とするのはこれです:

row_id:123 monthly_spend:4.55
row_id:567 monthly_spend:24.64
row_id:678 monthly_spend:123.09

私が使用しているコードは、この質問hereから派生したもので、次のようになります。

paste(row_id, monthly_spend, sep=":", collapse=" ")

列を変更せずに数値または整数としてフォーマットしようとしました。

助言がありますか?

4

4 に答える 4

1

データ スニペットで:

df <- read.table(text = "row_id       monthly_spend
 123            4.55
 567           24.64
 678          123.09", header = TRUE)

paste一緒にできますが、必要のないスペースを削除するためにformat関数を使用します。trim = TRUE

with(df, paste("row_id:", row_id,
               "monthly_spend:", format(monthly_spend, trim = TRUE)))

これにより、次のことが得られます。

> with(df, paste("row_id:", row_id,
+                 "monthly_spend:", format(monthly_spend, trim = TRUE)))
[1] "row_id: 123 monthly_spend: 4.55"   "row_id: 567 monthly_spend: 24.64" 
[3] "row_id: 678 monthly_spend: 123.09"

ファイルに書き出す前にデータ フレームでこれが必要な場合は、次を使用します。

newdf <- with(df, data.frame(foo = paste("row_id:", row_id,
                                         "monthly_spend:",
                                         format(monthly_spend, trim = TRUE))))
newdf

> newdf
                                foo
1   row_id: 123 monthly_spend: 4.55
2  row_id: 567 monthly_spend: 24.64
3 row_id: 678 monthly_spend: 123.09

これを書き出すと、必要に応じて列が揃えられます。

于 2013-03-31T19:09:24.467 に答える
1

データが data.frame にあると仮定した場合の一般的な答え (任意の数の変数) を次に示しdatます。

x <- mapply(names(dat), dat, FUN = paste, sep = ":")
write.table(x, file = stdout(),
               quote = FALSE, row.names = FALSE, col.names = FALSE)

stdout()そして、ファイル名に置き換えることができます。

于 2013-03-31T19:11:14.873 に答える
1

ベクターを data.frame に入れる場合 (まだ入っていない場合)、次を使用できます。

apply(sapply(names(myDF),  function(x)
    paste(x, myDF[, x], sep=":")  ), 1, paste, collapse=" ")

#  [1] "row_id:123 monthly_spend:4.55"  
#  [2] "row_id:567 monthly_spend:24.64" 
#  [3] "row_id:678 monthly_spend:123.09"

または代わりに:

do.call(paste, lapply(names(myDF), function(x) paste0(x, ":", myDF[, x])))

sprintfもオプションです。あなたはそれについて多くの方法を持っています

使用したサンプルデータ:

myDF <- read.table(header=TRUE, text=
"row_id       monthly_spend
123            4.55
567           24.64
678          123.09")
于 2013-03-31T19:06:45.883 に答える
1

assuming the data frame is called df

 write.table(as.data.frame(sapply(1:ncol(df),FUN=function(x)paste(rep(colnames(df)[x],nrow(df)),df[,x],sep=":"))),"someFileName",row.names=FALSE,col.names=FALSE,sep=" ");

equivalent to following substeps:

# generating the column separated records
df_cp<-sapply(1:ncol(df),FUN=function(x)paste(rep(colnames(df)[x],nrow(df)),df[,x],sep=":"));
### casting to data frame
df_cp<-as.data.frame(df_cp);
### writing out to disk
write.table(df_cp,"someFileName",row.names=FALSE,col.names=FALSE,sep=" ");
于 2013-03-31T19:07:46.010 に答える