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

如果您将向量放入 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

假设数据框被称为 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=" ");
于 2013-03-31T19:07:46.010 回答
1

使用您的数据片段:

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

我们可以paste一起使用formatwith 函数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 回答