【问题标题】:R concentrating data frameR集中数据框
【发布时间】:2012-08-23 14:33:12
【问题描述】:

我有一个这样的数据框

>X_com
  Day_1 Day_2 Day_3 Day_4 Day_5 Day_6 Day_7 Day_8 Day_9 Day_10
1     0     0     0     0     0     0     0     0     0      1
2     0     0     0     0     0     0     0     0     0      0
3     0     0     0     0     0     0     0     0     0      0
4     0     0     0     0     0     0     0     0     0      0
5     0     0     0     0     0     0     0     0     0      0
6     0     0     0     0     0     0     0     0     0      0
7     0     0     0     0     0     0     0     0     0      0
8     0     0     0     0     0     0     0     0     0      0

我需要将所有值集中到一个列中,并添加另一列“1;” 所以我这样做了

> X_new=matrix(1,8,2)
> X_new[1,]=paste(X_com[1,1], X_com[1,2],X_com[1,3],X_com [1,4],X_com[1,5],X_com[1,6],X_com[1,7],X_com[1,8],X_com [1,9],X_com[1,10], sep="")
> X_new[2,]=paste(X_com[2,1], X_com[2,2],X_com[2,3],X_com [2,4],X_com[2,5],X_com[2,6],X_com[2,7],X_com[2,8],X_com [2,9],X_com[2,10], sep="")
> X_new[3,]=paste(X_com[3,1], X_com[3,2],X_com[3,3],X_com [3,4],X_com[3,5],X_com[3,6],X_com[3,7],X_com[3,8],X_com [3,9],X_com[3,10], sep="")
> X_new[4,]=paste(X_com[4,1], X_com[4,2],X_com[4,3],X_com [4,4],X_com[4,5],X_com[4,6],X_com[4,7],X_com[4,8],X_com [4,9],X_com[4,10], sep="")
> X_new[5,]=paste(X_com[5,1], X_com[5,2],X_com[5,3],X_com [5,4],X_com[5,5],X_com[5,6],X_com[5,7],X_com[5,8],X_com [5,9],X_com[5,10], sep="")
> X_new[6,]=paste(X_com[6,1], X_com[6,2],X_com[6,3],X_com [6,4],X_com[6,5],X_com[6,6],X_com[6,7],X_com[6,8],X_com [6,9],X_com[6,10], sep="")
> X_new[7,]=paste(X_com[7,1], X_com[7,2],X_com[7,3],X_com [7,4],X_com[7,5],X_com[7,6],X_com[7,7],X_com[7,8],X_com [7,9],X_com[7,10], sep="")
> X_new[8,]=paste(X_com[8,1], X_com[8,2],X_com[8,3],X_com [8,4],X_com[8,5],X_com[8,6],X_com[8,7],X_com[8,8],X_com [8,9],X_com[8,10], sep="")
> X_new[1:8,2]="1;"
> as.data.frame(X_new)
          V1 V2
1 0000000001 1;
2 0000000000 1;
3 0000000000 1;
4 0000000000 1;
5 0000000000 1;
6 0000000000 1;
7 0000000000 1;
8 0000000000 1;

我相信肯定有更快的方法来实现这一点,但不知道。

另一个问题是,我有一千多个这样的数据框需要集中。我仍在学习如何循环这些重复的步骤,但进展相当缓慢。如果原始数据框被唯一命名,这是否意味着我别无选择,只能单独处理每个数据框?

【问题讨论】:

    标签: r for-loop dataframe iteration


    【解决方案1】:

    我不保证速度:

    dat <- read.table(text = " Day_1 Day_2 Day_3 Day_4 Day_5 Day_6 Day_7 Day_8 Day_9 Day_10
    + 1     0     0     0     0     0     0     0     0     0      1
    + 2     0     0     0     0     0     0     0     0     0      0
    + 3     0     0     0     0     0     0     0     0     0      0
    + 4     0     0     0     0     0     0     0     0     0      0
    + 5     0     0     0     0     0     0     0     0     0      0
    + 6     0     0     0     0     0     0     0     0     0      0
    + 7     0     0     0     0     0     0     0     0     0      0
    + 8     0     0     0     0     0     0     0     0     0      0",header = TRUE,sep = "")
    > data.frame(V1 = apply(dat,1,paste0,collapse = ""),V2 = "1;")
              V1 V2
    1 0000000001 1;
    2 0000000000 1;
    3 0000000000 1;
    4 0000000000 1;
    5 0000000000 1;
    6 0000000000 1;
    7 0000000000 1;
    8 0000000000 1;
    

    【讨论】:

      【解决方案2】:

      apply(x, 1, paste0, collapse = "")可以解决你的问题的症结

      例如:

      x <- as.data.frame(matrix(sample(0:1, 100, TRUE), ncol = 10))
      apply(x, 1, paste0, collapse = "")
      ####
       [1] "1010001111" "1110001101" "1100100000" "0111000110" "0111101000" "0101100100"
       [7] "1110100110" "1001100010" "1101111011" "1101001111"
      

      你可能想把它放到一个函数中,因为听起来你有很多data.frames到lapply这个到:

      foo <- function(data, val) {
        collapse <- apply(data, 1, paste0, collapse = "")
        out <- data.frame(collapse, val)
        return(out)
        }
      
      > foo(x,1)
           collapse val
      1  1010001111   1
      2  1110001101   1
      3  1100100000   1
      ----
      

      【讨论】:

        【解决方案3】:

        我发布了原始问题,但不小心删除了该帐户。所以我不能对答案发表评论。

        只想说声谢谢。

        另外我猜你的部分代码应该被编辑,其中“paste0”应该被替换为“paste”?

        collapse <- apply(data, 1, paste, collapse = "")
        

        我需要的最后一列是“1:”,您创建的函数也可以作为:

        > foo(x, "1;")
             collapse val
        1  0010111000  1;
        2  0000110001  1;
        3  1100100101  1;
        4  1100011100  1;
        5  1111001101  1;
        6  1100000111  1;
        7  0001001001  1;
        8  1110000011  1;
        9  1011011101  1;
        10 1111111000  1;
        

        非常感谢。

        【讨论】:

        • 如果您没有 paste0,那么您运行的是旧版本的 R。
        • 哦!我正在运行旧版本的 2.13.1。 paste 和 paste0 在我的情况下会做不同的事情吗? (我不愿意继续更新我的 R,因为我使用的主包总是与新版本的 R 有问题)。
        猜你喜欢
        • 2018-11-24
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 2013-09-27
        • 2018-10-06
        • 2022-01-09
        相关资源
        最近更新 更多