我正在寻找一种方法,以便从具有多个信息的数据帧中创建一个新的数据帧
也许它仍然是一个简单的事情给你做,但我真的不能得到想要的结果,也许一些[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
带有 colnameGroup1
和 rowname 的所有Spname
存在的所有内容df1
:
Species Group1
Sp1
Sp2
Sp3
Sp4
Sp5
Sp6
Sp7
Sp8
Sp9
Sp10
Sp11
Sp12
**如何填写这张表?**为了决定把什么Sp1
的Group1
,我看看那里该物种存在于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
for相比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
in 的另一个例子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
and5
不存在,所以我添加NA
andSp6
并且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
andSp9
都存在于Events 1
and 中2
:Sp8
具有smallest value
in的事件Colvalue1
是Event 2
(所以它会有字母E
)。Sp9
具有smallest value
in的事件Colvvalue1
是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
然后对于Sp10,11
&12
在Event3
那里不是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
那么我的值NO
,如果没有其他Colvalue1 <=
比5
。
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
它有一个Colvalue1 > 5
inEvent1
但它也有一个Colvalue1 = 0.3
inEvent2
所以它取值G
。
但是因为Sp2
它只存在于带有 的 Event1 中Colvalue1 > 5
,所以我只是分配一个值NO
。
这是数据框:
dput(head(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>)
通过这种方法:
separate
将Species
列变为 2,因为使用“Sp”和数字来标识Species
group_by
两者Col1
(组)并Species
查看Colvalue1
每个组/物种组合内的最小值Colvalue1
(并保留NA
,因为在最终结果中需要)pivot_wider
将分出第 1 组和第 2 组的结果Species
字符串内的数值排序编辑:要在示例中解决 Group3,请添加一个附加项mutate
,如果所有项Colvalue1
都 > 5,则替换为“NO”。代码和输出已更新。
编辑:为了确保X
在检查Colvalue1
> 5 的级别后仍然存在,它还检查以确保Colvalue1
不是NA
。(如果是,NA
那么 else 将确保Colvalue2
仍然存在)。mutate 语句已编辑,输出更新如下。
library(tidyverse)
df %>%
separate(Col2, into = c("Species", "Species_row"), sep = "([.])") %>%
group_by(Col1, Species) %>%
filter(Colvalue1 == min(Colvalue1) | is.na(Colvalue1)) %>%
mutate(Colvalue2 = replace_na(Colvalue2, "X"),
Colvalue2 = ifelse(all(Colvalue1 > 5) && all(!is.na(Colvalue1)), "NO", Colvalue2)) %>%
slice(1) %>%
pivot_wider(id_col = Species, names_from = Col1, values_from = Colvalue2) %>%
arrange(as.integer(str_extract(Species, "\\d+")))
输出
# A tibble: 12 x 4
# Groups: Species [12]
Species Group1 Group2 Group3
<chr> <chr> <chr> <chr>
1 Sp1 A NA G
2 Sp2 B NA NO
3 Sp3 B NA NO
4 Sp4 B NA G
5 Sp5 B NA NA
6 Sp6 C D NA
7 Sp7 NA D NA
8 Sp8 NA E G
9 Sp9 NA E NA
10 Sp10 NA X NA
11 SP11 NA X NA
12 SP12 NA X NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句