使用 R 从一个 df 及其不同的列值创建一个新的 df

格伦德尔

我正在寻找一种方法,以便从具有多个信息的创建一个新的

也许它仍然是一个简单的事情给你做,但我真的不能得到想要的结果,也许一些专家能告诉我吗?

这是第一个 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

**如何填写这张表?**为了决定把什么Sp1Group1,我看看那里该物种存在于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.20Colvalue1=1.40for相比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

等等等等...

Sp2in 的另一个例子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,89并且不存在于该组中,因此我添加了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,4and5不存在,所以我添加NAandSp6并且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

但是,Sp8andSp9都存在于Events 1and 中2Sp8具有smallest valuein的事件Colvalue1Event 2(所以它会有字母E)。Sp9具有smallest valuein的事件Colvvalue1Event 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&12Event3那里不是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 > 5inEvent1但它也有一个Colvalue1 = 0.3inEvent2所以它取值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>)
Ben

通过这种方法:

  • separateSpecies列变为 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何最好地使用来自另一个df的索引值来创建新的df,该索引值用于检索多个值?

熊猫:从另一个包含组内特定值的df创建新的df

使用另一个df替换列值

使用一个列中的值从另一个列中选择值,并放入R中的新df中

使用R中的查找表基于另一个df创建新列

使用从一个Azure DF管道到另一个管道的查找

Tricky与R中的日期合并-从一个df扩展行以匹配另一个

更改一个df中的列值以匹配不同df中的列值?

在一个df中使用名称创建另一个数据框的相同列副本

从一个df提取列的子集,然后从另一个df粘贴到行中

在R分组的df中插入指定的值,并使用另一个df(R)填充缺少的值

从R中的df创建一个比较表

如何通过熊猫将特定的列从一个df复制/粘贴到另一个df

pandas:从一个df中搜索包含列表的另一个df列中的列值

R-根据列值的首次出现返回df中行的第一个值

pandas:使用与另一个df中的索引和列匹配的值填充df列

熊猫只在有条件的情况下从一个df插入到另一个df的新值

R:使用一个df中的搜索键来识别第二个df中的值的功能

突出显示从一个df到另一个df的字符串

如何将 R 中的 df 与类别值与另一个 df 及其相应值合并?

使用另一个 df 计算一个 df 的多个列中值的条件出现

如果值与另一个 df 一致,如何使用 r 添加特定行的值?

从多个 dfs 创建一个 df

使用来自另一个 DF 的值创建 Dataframes 列并在 R 中匹配更新

使用另一个 DF 的列(两个 DF 中的列相同)过滤 DF Spark Scala

使用来自另一个 DF (Scala Spark) 的架构创建一个空的 DF

检查从一个 df 到另一个 df 中的另一列的一列中的字符串值

使用一个 df 列过滤另一个 df,多个过滤器

如何在 df 中创建一个新列并使用 shift 函数?