控制文本对齐

时间:2013-03-31 18:56:26

标签: r

我正在尝试为另一个以空格分隔的程序创建输入文件。我将多列的内容粘贴在一起,并且当数字具有不同的长度时由于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 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

假设数据帧被称为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=" ");

相当于以下子步骤:

# 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=" ");

答案 2 :(得分: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

当您将其写出来时,列将根据您的需要进行调整。

答案 3 :(得分: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()