1

我有一个这样的数据框

>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;

我相信肯定有一种更快的方法可以实现这一目标,但不知道。

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

4

3 回答 3

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.frameslapply来:

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
----
于 2012-08-29T02:48:01.580 回答
0

我对此速度不做任何保证:

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;
于 2012-08-29T02:45:51.443 回答
0

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

只想说声谢谢。

另外我猜你的部分代码应该被编辑,其中“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;

太感谢了。

于 2012-08-29T03:30:34.213 回答