将每个第n列中的所有值替换为来自不同数据帧的值

时间:2015-08-11 05:16:59

标签: r

我有一个大数据帧A,其微阵列数据为47323行和1570列。我需要将数据帧A中每第三列中的所有值替换为存储在数据帧B中的新的校正值。因此,我需要将A列中的第3,6,9等等值替换为第1列中的值,来自B的2,3等。

两个数据框中的行数相同。列名称部分匹配(数据框A中的每三个列名称和数据框B中的列名称)。

有谁能请我指出正确的方向来解决这个问题?

我对生物学家提出的基本编程问题表示道歉。

3 个答案:

答案 0 :(得分:0)

这样的事可能吗?

cols <- seq(3, 1570, 3)
A[cols] <- B[seq(cols)]

这将取代A中的第3列,第6列,第9列等,其中包含来自B的第1,2,3等列。

答案 1 :(得分:0)

以下是我的建议:

#--- Example data ---
n <- 5
m1 <- 18
m2 <- 4
A <- as.data.frame(matrix(1:(n*m1),n,m1))
B <- as.data.frame(outer(rep(-100,5)-(1:n),1:m2))
A
B
#------------------------------------------------
i <- 1
k <- min(1+(ncol(A)-i) %/% 3,ncol(B))
A[,3*(1:k)+i-3] <- B[,1:k]
A

A的列i,i + 3,i + 6,......被B列1,2,3,...替换:

> #--- Example data ---
> n <- 5

> m1 <- 18

> m2 <- 4

> A <- as.data.frame(matrix(1:(n*m1),n,m1))

> B <- as.data.frame(outer(rep(-100,5)-(1:n),1:m2))

> A
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
1  1  6 11 16 21 26 31 36 41  46  51  56  61  66  71  76  81  86
2  2  7 12 17 22 27 32 37 42  47  52  57  62  67  72  77  82  87
3  3  8 13 18 23 28 33 38 43  48  53  58  63  68  73  78  83  88
4  4  9 14 19 24 29 34 39 44  49  54  59  64  69  74  79  84  89
5  5 10 15 20 25 30 35 40 45  50  55  60  65  70  75  80  85  90

> B
    V1   V2   V3   V4
1 -101 -202 -303 -404
2 -102 -204 -306 -408
3 -103 -206 -309 -412
4 -104 -208 -312 -416
5 -105 -210 -315 -420

> #------------------------------------------------
> i <- 1

> k <- min(1+(ncol(A)-i) %/% 3,ncol(B))

> A[,3*(1:k)+i-3] <- B[,1:k]

> A
    V1 V2 V3   V4 V5 V6   V7 V8 V9  V10 V11 V12 V13 V14 V15 V16 V17 V18
1 -101  6 11 -202 21 26 -303 36 41 -404  51  56  61  66  71  76  81  86
2 -102  7 12 -204 22 27 -306 37 42 -408  52  57  62  67  72  77  82  87
3 -103  8 13 -206 23 28 -309 38 43 -412  53  58  63  68  73  78  83  88
4 -104  9 14 -208 24 29 -312 39 44 -416  54  59  64  69  74  79  84  89
5 -105 10 15 -210 25 30 -315 40 45 -420  55  60  65  70  75  80  85  90
> 

如果&#34; B&#34;如果列太多,则会忽略悬垂列。例如,如果m2 = 8且i = 2:

> #--- Example data ---
> n <- 5

> m1 <- 18

> m2 <- 8

> A <- as.data.frame(matrix(1:(n*m1),n,m1))

> B <- as.data.frame(outer(rep(-100,5)-(1:n),1:m2))

> A
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
1  1  6 11 16 21 26 31 36 41  46  51  56  61  66  71  76  81  86
2  2  7 12 17 22 27 32 37 42  47  52  57  62  67  72  77  82  87
3  3  8 13 18 23 28 33 38 43  48  53  58  63  68  73  78  83  88
4  4  9 14 19 24 29 34 39 44  49  54  59  64  69  74  79  84  89
5  5 10 15 20 25 30 35 40 45  50  55  60  65  70  75  80  85  90

> B
    V1   V2   V3   V4   V5   V6   V7   V8
1 -101 -202 -303 -404 -505 -606 -707 -808
2 -102 -204 -306 -408 -510 -612 -714 -816
3 -103 -206 -309 -412 -515 -618 -721 -824
4 -104 -208 -312 -416 -520 -624 -728 -832
5 -105 -210 -315 -420 -525 -630 -735 -840

> #------------------------------------------------
> i <- 2

> k <- min(1+(ncol(A)-i) %/% 3,ncol(B))

> A[,3*(1:k)+i-3] <- B[,1:k]

> A
  V1   V2 V3 V4   V5 V6 V7   V8 V9 V10  V11 V12 V13  V14 V15 V16  V17 V18
1  1 -101 11 16 -202 26 31 -303 41  46 -404  56  61 -505  71  76 -606  86
2  2 -102 12 17 -204 27 32 -306 42  47 -408  57  62 -510  72  77 -612  87
3  3 -103 13 18 -206 28 33 -309 43  48 -412  58  63 -515  73  78 -618  88
4  4 -104 14 19 -208 29 34 -312 44  49 -416  59  64 -520  74  79 -624  89
5  5 -105 15 20 -210 30 35 -315 45  50 -420  60  65 -525  75  80 -630  90
> 

答案 2 :(得分:0)

如果“B”中列的名称与A中应该替换的列的名称相匹配,则可以使用

left -> Java