【发布时间】:2020-04-04 14:28:01
【问题描述】:
我正在寻找一种方法,以便从具有多个信息的dataframe 创建一个新的dataframe
也许对你来说这仍然是一件简单的事情,但我无法真正得到想要的结果,也许有r的专家可以启发我?
这是第一个df:
Col1 Col2 Event Colvalue1 Colvalue2
Group1 Sp1.1 1 0.20 A
Group1 Sp1.2 1 0.20 A
Group1 Sp2.1 1 0.20 B
Group1 Sp3.1 2 0.12 B
Group1 Sp4.2 2 0.12 B
Group1 Sp5.1 2 0.12 B
Group1 Sp1.3 3 1.40 C
Group1 Sp1.4 3 1.40 C
Group1 Sp6.1 3 1.40 C
Group2 Sp6.1 1 1.20 D
Group2 Sp7.1 1 1.20 D
Group2 Sp9.3 1 1.20 D
Group2 Sp8.1 1 1.20 D
Group2 Sp8.2 2 0.40 E
Group2 Sp9.1 2 0.40 E
Group2 Sp9.2 2 0.40 E
Group2 Sp10.1 3 NA NA
Group2 SP11.2 3 NA NA
Group2 SP12.1 3 NA NA
Group3 Sp1.1 1 5.2 F
Group3 Sp2.1 1 5.2 F
Group3 Sp3.1 1 5.2 F
Group3 Sp4.1 2 0.3 G
Group3 Sp4.2 2 0.3 G
Group3 Sp1.2 2 0.3 G
Group3 Sp8.1 2 0.3 G
这个想法是得到一个new_df 输出:
Species Group1 Group2 Group3
Sp1 A NA G
Sp2 B NA NO
Sp3 B NA NO
Sp4 B NA G
Sp5 B NA NA
Sp6 C D NA
Sp7 NA D NA
Sp8 NA E G
Sp9 NA E NA
Sp10 NA X NA
Sp11 NA X NA
Sp12 NA X NA
解释如下:这个想法是首先遍历df1 中的每个组。让我们拿第一个:
Col1 Col2 Event Colvalue1 Colvalue2
Group1 Sp1.1 1 0.20 A
Group1 Sp1.2 1 0.20 A
Group1 Sp2.1 1 0.20 B
Group1 Sp3.1 2 0.12 B
Group1 Sp4.2 2 0.12 B
Group1 Sp5.1 2 0.12 B
Group1 Sp1.3 3 1.40 C
Group1 Sp1.4 3 1.40 C
Group1 Sp6.1 3 1.40 C
从这个组中,我想创建一个new_df,列名Group1,行名中的所有Spname 都存在于所有df1:
Species Group1
Sp1
Sp2
Sp3
Sp4
Sp5
Sp6
Sp7
Sp8
Sp9
Sp10
Sp11
Sp12
**如何填写这张表? ** 为了决定在Group1 中为Sp1 放什么,我看看这个物种在Group1: 中的位置
Col1 Col2 Event Colvalue1 Colvalue2
Group1 Sp1.1 1 0.20 A
Group1 Sp1.2 1 0.20 A
Group1 Sp1.3 3 1.40 C
Group1 Sp1.4 3 1.40 C
我查看 Colvalue1 列并只保留具有最低值的事件,这里是 Event=1,因为 Colvalue1=0.20 而 Colvalue1=1.40 是 Event3。
这就是我所剩下的:
Col1 Col2 Event Colvalue1 Colvalue2
Group1 Sp1.1 1 0.20 A
Group1 Sp1.2 1 0.20 A
这就是我知道我将在此处的Colvalue2 列中添加字母'C':
Species Group1
Sp1 A
Sp2
Sp3
Sp4
Sp5
Sp6
Sp7
Sp8
Sp9
Sp10
Sp11
Sp12
等等等等……
Sp2 在Group1 中的另一个示例:
这里只出现一次:
Group1 Sp2.1 1 0.20 B
所以我填写了B的信:
Species Group1
Sp1 A
Sp2 B
Sp3
Sp4
Sp5
Sp6
Sp7
Sp8
Sp9
Sp10
Sp11
Sp12
Sp3,4, 5 & Sp6 也一样:
Species Group1
Sp1 A
Sp2 B
Sp3 B
Sp4 B
Sp5 B
Sp6 C
Sp7
Sp8
Sp9
Sp10
Sp11
Sp12
另一方面,Sp7,8 和 9 不在此组中,所以我添加了一个 NA:
Species Group1
Sp1 A
Sp2 B
Sp3 B
Sp4 B
Sp5 B
Sp6 C
Sp7 NA
Sp8 NA
Sp9 NA
Sp10 NA
Sp11 NA
Sp12 NA
让我们去Group2...:
Col1 Col2 Event Colvalue1 Colvalue2
Group2 Sp6.1 1 1.20 D
Group2 Sp7.1 1 1.20 D
Group2 Sp9.3 1 1.20 D
Group2 Sp8.1 1 1.20 D
Group2 Sp8.2 2 0.40 E
Group2 Sp9.1 2 0.40 E
Group2 Sp9.2 2 0.40 E
这里Sp1,2,3,4 和5 不存在,所以我添加NA 和Sp6 和Sp7 只存在于Event1 所以我添加了相关的字母(D):
Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA
Sp9 NA
Sp10 NA
Sp11 NA
Sp12 NA
但是,Sp8 和 Sp9 都出现在 Events 1 和 2 中:Sp8 在 Colvalue1 中具有 smallest value 的事件是 Event 2(因此它将具有信E)。 Sp9 在Colvvalue1 中有smallest value 的事件是Event 2(所以它会有E 的字母)。
Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA E
Sp9 NA E
Sp10 NA
Sp11 NA
Sp12 NA
然后对于Event3 中的Sp10,11 和12,没有Colvalue1,所以我只放了一个X。
Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA E
Sp9 NA E
Sp10 NA X
Sp11 NA X
Sp12 NA X
事情就是这样,我希望它足够清楚,如果有任何问题仍然不清楚,请随时提出问题。如果有人可以帮助我,那将是非常好的他/她。同时,在这个复杂的时期,你们都照顾好自己……
在Group3 处增加复杂性:
这里当 Colvalue1 是 > to 5 时,如果没有其他 Colvalue1 <= 而不是 5,那么我的值是 NO。
Group3 Sp1.1 1 5.2 F
Group3 Sp2.1 1 5.2 F
Group3 Sp3.1 1 5.2 F
Group3 Sp4.1 2 0.3 G
Group3 Sp4.2 2 0.3 G
Group3 Sp1.2 2 0.3 G
Group3 Sp8.1 2 0.3 G
所以在事件 1 中,例如 Sp1 :
Group3 Sp1.1 1 5.2 F
Group3 Sp1.2 2 0.3 G
它在Event1 中有一个Colvalue1 > 5,但它在Event2 中也有一个Colvalue1 = 0.3,所以它的值是G。
但是对于Sp2,它只出现在带有Colvalue1 > 5 的Event1 中,所以我只分配了一个值NO。
这是数据框:
输入(头部(df))
structure(list(Col1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Group1",
"Group2", "Group3"), class = "factor"), Col2 = structure(c(1L,
2L, 8L, 9L, 11L, 12L), .Label = c("Sp1.1", "Sp1.2", "Sp1.3",
"Sp1.4", "Sp10.1", "SP11.2", "SP12.1", "Sp2.1", "Sp3.1", "Sp4.1",
"Sp4.2", "Sp5.1", "Sp6.1", "Sp7.1", "Sp8.1", "Sp8.2", "Sp9.1",
"Sp9.2", "Sp9.3"), class = "factor"), Event = c(1L, 1L, 1L, 2L,
2L, 2L), Colvalue1 = c(0.2, 0.2, 0.2, 0.12, 0.12, 0.12), Colvalue2 = c("A",
"A", "B", "B", "B", "B"), Mean_dNdS = c(NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_, NA_character_)), class = c("data.table",
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x7f8afd8052e0>)
【问题讨论】:
标签: dataframe r r dataframe data-manipulation