【问题标题】:Use R in order to create a new df from one df and its different column values使用 R 以便从一个 df 及其不同的列值创建一个新的 df
【发布时间】:2020-04-04 14:28:01
【问题描述】:

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

也许对你来说这仍然是一件简单的事情,但我无法真正得到想要的结果,也许有的专家可以启发我?

这是第一个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.20Colvalue1=1.40Event3。 这就是我所剩下的:

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

等等等等……

Sp2Group1 中的另一个示例:

这里只出现一次:

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,45 不存在,所以我添加NASp6Sp7 只存在于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

但是,Sp8Sp9 都出现在 Events 12 中:Sp8Colvalue1 中具有 smallest value 的事件是 Event 2(因此它将具有信E)。 Sp9Colvvalue1 中有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,1112,没有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


    【解决方案1】:

    采用这种方法:

    • separateSpecies列改成2,因为用“Sp”和数字来标识Species
    • group_byCol1(组)和Species 查看每个组/物种组合中Colvalue1 的最小值
    • 只保留Colvalue1 的最小值(并保留NA,因为最终结果中需要)
    • 最终的pivot_wider 将在结果中分配第 1 组和第 2 组
    • Species字符串中的数值排序

    编辑:要在示例中寻址 Group3,请添加额外的 mutate,如果所有 Colvalue1 均 > 5,则替换为“否”。代码和输出已更新。

    编辑:为确保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
    

    【讨论】:

    • 哇非常感谢@Ben!我再次打扰您添加一点复杂性,我用帖子中添加的第 3 组来说明它,我在最后解释了规则。这个想法是引入阈值,如果达到这个阈值并且我们没有任何其他事件,其中物种在这个阈值下具有最低值,我会设置一个 NO 值。
    • 我得到错误:列 Colvalue2 无法从整数转换为字符
    • 是的,但它似乎有效,但 Group2 中的 Sp10,11 and 12 不再存在 X?我在最后添加了 dput。
    • 好的,非常感谢你,它现在就像一个魅力!保重:)
    • @Grendel 我做了一个小修改,不确定这会有所作为。但真的应该检查所有值是否不是NA。刚刚编辑了变异。据我所知,答案相同。
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 2021-05-12
    • 2023-02-14
    • 2020-10-09
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多