【问题标题】:R - extract row as character string with double quoteR - 将行提取为带双引号的字符串
【发布时间】:2015-06-04 15:20:11
【问题描述】:

我有一个名为 dataf 的数据框

dataf<-data.frame(replicate(10,sample(0:1,10,rep=TRUE)))

我想用这个函数把这个数据框的每一行提取为一个字符串:

result=data.frame(matrix(NA, ncol=1, nrow=10))

i=0
for(i in 0:9)
{
  result[i+1,]=toString(dataf[i+1,])
}

但结果不如预期:

1, 0, 0, 0, 1, 0, 0, 1, 1, 0
0, 0, 0, 1, 1, 1, 1, 0, 1, 1
1, 1, 0, 0, 0, 0, 0, 0, 1, 0

我想要这个:

"1","0","0","0","1","0","0","1","1","0"
"0","0","0","1","1","1","1","0","1","1"
"1","1","0","0","0","0","0","0","1","0"

我已经尝试过使用dQuote\"R\"collapsesep……但我没有得到我需要的东西。

【问题讨论】:

    标签: r dataframe character


    【解决方案1】:

    试试:capture.output(write.table(lapply(dataf, as.character), row.names=F, col.names=F, sep=","))

     [1] "\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\""
     [2] "\"1\",\"0\",\"1\",\"0\",\"0\",\"0\",\"1\",\"0\",\"1\",\"1\""
     [3] "\"0\",\"1\",\"0\",\"0\",\"1\",\"1\",\"0\",\"0\",\"1\",\"1\""
    ...
    

    根据下面马修的评论进行编辑

    【讨论】:

    • 好主意,不幸的是这只会打印到屏幕上。您可以将其包装在 capture.output 中以保存到变量中。
    • 是的!非常好!有用。非常感谢,非常感谢!只是另一件事,对不起,你知道如何处理 NA。 Na 不带双引号.....
    • 您可以在执行上述操作之前将 NA 转换为字符 - dataf[is.na(dataf)] &lt;- "NA"
    【解决方案2】:

    这是另一个选项,类似于@Phil 的方法,但输出与@JayBlack 相同。

    apply(dataf, 1, function(.) paste(dQuote(.), collapse=','))
    

    这将返回以下字符串向量。

     [1] "\"0\",\"0\",\"1\",\"0\",\"1\",\"1\",\"0\",\"0\",\"1\",\"1\""
     [2] "\"1\",\"0\",\"1\",\"1\",\"1\",\"0\",\"0\",\"0\",\"1\",\"0\""
     [3] "\"1\",\"1\",\"0\",\"1\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\""
     .....
    

    【讨论】:

      【解决方案3】:

      [编辑]

      这是一种方法:

      d <- apply(dataf, 1, toString)
      splitup <- lapply(d, function(x) paste('\"', unlist(strsplit(x, ',')), ',\"', sep=''))
      
      data.frame(do.call(rbind, splitup))
           X1    X2    X3    X4    X5    X6    X7    X8    X9
      1  "1," " 0," " 0," " 1," " 1," " 0," " 1," " 0," " 1,"
      2  "1," " 0," " 1," " 1," " 0," " 1," " 0," " 0," " 0,"
      3  "0," " 0," " 1," " 0," " 1," " 0," " 1," " 0," " 0,"
      4  "0," " 1," " 1," " 1," " 0," " 0," " 1," " 1," " 1,"
      5  "1," " 0," " 1," " 0," " 0," " 1," " 0," " 1," " 1,"
      6  "1," " 0," " 1," " 1," " 0," " 0," " 0," " 1," " 0,"
      7  "1," " 0," " 1," " 0," " 0," " 1," " 1," " 1," " 1,"
      8  "0," " 1," " 0," " 1," " 0," " 1," " 0," " 1," " 1,"
      9  "1," " 1," " 1," " 0," " 0," " 1," " 0," " 1," " 0,"
      10 "0," " 0," " 0," " 0," " 0," " 1," " 0," " 0," " 1,"
      

      【讨论】:

      • 你是对的。尝试别的东西。我以前在这里看到过,试图记住。
      • 非常感谢您的帮助。我认为我们很接近。但正如你所看到的,我们得到这个:“1”、“0”、“0”、“1”、“1”、“0”、“1”、“0”、“1”,但我需要这个: "1", "0" ,"0","1","1","0","1","0","1" 我会尝试调整你的代码。谢谢,非常感谢。
      【解决方案4】:

      编辑:不是您指定但可能对其他人有用的输出?

      apply(dataf, 1, paste0, collapse = "")
      

      产量:

      [1] "0000000101" "0100100111" "1110101001" "1001010101" "1011111100" "1010000111"
      [7] "0110001110" "1111000011" "1001101000" "0010011010"
      

      这是你希望的输出吗?

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多