如何管理R中输出文本文件中的名称?

时间:2015-02-25 17:39:46

标签: r text

数据:

    sam:
     res = 0.25 , res1=0.30
    bad: 
     res= 0.30 , res1=0.23

代码:

    write.table(sam, file = "C:\\Users\\data1.txt", append = F, sep = " ", row.names = TRUE,col.names = TRUE)
   write.table(bad, file = "C:\\Users\\data1.txt", append = T, sep = " ",row.names = TRUE, col.names = TRUE)

data1的输出:

   "x"
   "1" 0.25
    "x"
   "1" 0.3

事实上,我希望文本文件data1中的输出是这样的:

              res      res1
 sam           0.25    0.30
 bad           0.3     0.23

任何想法都表示赞赏!

2 个答案:

答案 0 :(得分:2)

您可以在write.table()中提供命名向量。您只需将第二组列名设置为FALSE,因为它们已在第一次初始调用中提供。

sam <- 0.25; bad <- 0.30

write.table(c(sam = sam), col.names = "res", file = "data")
write.table(c(bad = bad), col.names = FALSE, file = "data", append = TRUE)

## read it back in
read.table("data")
#      res
# sam 0.25
# bad 0.30

在回复您的评论时,您可以编写辅助函数,以便在初始化文件后执行附加操作。然后我们可以将其作为列表读取,以便我们可以在返回数据帧或矩阵之间进行选择。

sam <- 0.25
bad = 0.3

## initial file creation
write.table(cbind(sam, bad), "data", row.names = FALSE)

## function to append to 'data'
wtFun <- function(x) {
    write.table(x, "data", append = TRUE, col.names = FALSE, row.names = FALSE)
}

## new values
sam2 <- 0.99
bad2 <- 25

## append new values
wtFun(cbind(sam2, bad2))

## read the file as a list and set the names
res <- setNames(
    scan("data", what = list(0, 0), skip = 1L),
    scan("data", what = "", nlines = 1L)
)

## 'res' as a matrix
do.call(rbind, res)
#     [,1]  [,2]
# sam 0.25  0.99
# bad 0.30 25.00

## 'res' as a data frame
as.data.frame(res)
#    sam  bad
# 1 0.25  0.3
# 2 0.99 25.0

答案 1 :(得分:1)

如果您将sambad写为data.frame s(或矩阵),而不是原子,这将更有效。例如,

sam <- 0.25
bad <- 0.30
##
write.table(
  data.frame(res=sam,row.names="sam"),
  file="F:/temp/data1.txt",
  append=F,sep=" ",
  col.names=TRUE,
  row.names=TRUE)
##
write.table(
  data.frame(res=bad,row.names="bad"),
  file="F:/temp/data1.txt",
  append=T,sep=" ",
  col.names=FALSE,
  row.names=TRUE)
##
R> read.table("F:/temp/data1.txt",header=TRUE)
     res
sam 0.25
bad 0.30

IMO虽然强制row.names属性并不是一个好主意,因为如果你将一个对象附加到一个已经存在的行名的文件中,你就会收到一个错误尝试重新读取它,因为row.names属性不能包含重复值。你最好做一些像

这样的事情
write.table(
  data.frame(name="sam",res=sam),
  file="F:/temp/data1.txt",
  append=F,sep=" ",
  col.names=TRUE,
  row.names=FALSE)
##
write.table(
  data.frame(name="bad",res=bad),
  file="F:/temp/data1.txt",
  append=T,sep=" ",
  col.names=FALSE,
  row.names=FALSE)
##
R> read.table("F:/temp/data1.txt",header=TRUE)
  name  res
1  sam 0.25
2  bad 0.30