将多个矩阵值分配给单个数据帧列

时间:2016-08-22 10:54:45

标签: r bioinformatics

我有以下数据框,其中包含163只猴子的信息:

> head(vervetdf)
    ucla_id                  country                             species Gender pi
1   A8516_M_2                 Barbados                 Chlorocebus sabaeus      M NA
2   AG23_F_10                 Tanzania Chlorocebus pygerythrus pygerythrus      F NA
3  AG5417_F_10                 Tanzania Chlorocebus pygerythrus pygerythrus      F NA
4  AGM126_F_1 Central African Republic               Chlorocebus tantalus       F NA
5  AGM127_F_1 Central African Republic                Chlorocebus tantalus      F NA
6  AGM129_F_1 Central African Republic                Chlorocebus tantalus      F NA

> str(vervetdf)
'data.frame':   163 obs. of  5 variables:
 $ ucla_id: Factor w/ 163 levels "A8516_M_2","AG23_F_10",..: 1 2 3 4 5 6 7 8        9 10 ...
 $ country: Factor w/ 12 levels "Barbados","Botswana",..: 1 11 11 3 3 3 3 3 3 3 ...
 $ species: Factor w/ 5 levels "Chlorocebus aethiops aethiops",..: 4 3 3 5 5 5 5 5 5 5 ...
 $ Gender : Factor w/ 2 levels "F","M": 2 1 1 1 1 1 1 2 1 2 ...
 $ pi     : logi  NA NA NA NA NA NA ...

我需要为每只猴子添加pi值进行分析和绘图,所以我创建了新的pi列。 Pi对于同一物种的所有猴子都是相同的(我有5种),但是在窗口中计算,因此每只猴子有1300个pi值。我有一个矩阵,每个物种都有pi值:

> head(corrected_pi)
          pi1         pi2         pi3         pi4         pi5
w1.ce 0.001918322 0.002408772 0.002306475 0.002086117 0.002501300
w2.ce 0.002125624 0.002779025 0.002620691 0.002599817 0.002847614
w3.ce 0.001512895 0.001886345 0.001867847 0.001658217 0.001875594
w4.ce 0.002340536 0.002637327 0.002736944 0.002252872 0.002848985
w5.ce 0.001329015 0.001553925 0.001654385 0.001654023 0.001806535
w6.ce 0.001326739 0.001595000 0.001487649 0.001417510 0.001581388

> dim(corrected_pi)
[1] 1300    5

那么,有没有办法可以在数据帧的一列中将所有pi值分配给相应的物种?

1 个答案:

答案 0 :(得分:0)

您可以使用pi包中的nest列出一列中物种的所有tidyr值。然后使用mergepi表加入vervetdf。在这里,我们假设您尚未为NA创建vervetdf$pi列,因为merge会为您执行此操作:

library(tidyr)
new.pi <- nest(data.frame(species=factor(levels(vervetdf$species), levels=levels(vervetdf$species)), t(corrected.pi)), -species, .key=pi)
result <- merge(vervetdf, new.pi, by="species", sort=FALSE)

鉴于您发布的数据有限(仅6行){<1}},

corrected.pi

注意:

  1. print(result) ## species ucla_id country Gender pi ##1 Chlorocebus sabaeus A8516_M_2 Barbados M 0.002306475, 0.002620691, 0.001867847, 0.002736944, 0.001654385, 0.001487649 ##2 Chlorocebus pygerythrus pygerythrus AG23_F_10 Tanzania F 0.002408772, 0.002779025, 0.001886345, 0.002637327, 0.001553925, 0.001595000 ##3 Chlorocebus pygerythrus pygerythrus AG5417_F_10 Tanzania F 0.002408772, 0.002779025, 0.001886345, 0.002637327, 0.001553925, 0.001595000 ##4 Chlorocebus tantalus AGM126_F_1 Central African Republic F 0.002086117, 0.002599817, 0.001658217, 0.002252872, 0.001654023, 0.001417510 ##5 Chlorocebus tantalus AGM127_F_1 Central African Republic F 0.002086117, 0.002599817, 0.001658217, 0.002252872, 0.001654023, 0.001417510 ##6 Chlorocebus tantalus AGM129_F_1 Central African Republic F 0.002086117, 0.002599817, 0.001658217, 0.002252872, 0.001654023, 0.001417510 是一个包含5行的数据框,每个行都有一行。
  2. new.pi是一个包含两个new.pi的数据框:
    • columns:这是使用vervetdf $ species列的级别创建的因子。这允许我们稍后加入这两个表。
    • species:由pi创建。请注意,nest创建一个以nest参数命名的新列,它是嵌套列中的值列表。 .key的第一个参数是要嵌套列的数据框。在这里,我们构建一个临时数据框,即nest列加上species的所有行(即corrected.pi)。然后我们选择除t(corrected.pi)列以外的所有列(即species