我正在尝试为另一个以空格分隔的程序创建输入文件。我将多列的内容粘贴在一起,并且当数字具有不同的长度时由于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=" ")
我尝试将列格式化为数字或整数而不做任何更改。
有什么建议吗?
答案 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()
。