首页 > 解决方案 > 使用 dplyr 和列中的一些条件创建一个新的数据框

问题描述

你好这里是一个数据框

   Groups Names COL1  COL2  COL3        COL4
1      G1   SP1    1 0.400 0.500   Sequence1
2      G1   SP1    1 0.004 0.005   Sequence2
3      G1   SP1    0 0.004 0.005   Sequence3
4      G1   SP2    0 0.400 0.005 Sequence123
5      G1   SP2    0 0.004 0.500  Sequence14
6      G1   SP3    0 0.005 0.006  Sequence15
7      G1   SP5    1 0.400 0.006  Sequence16
8      G1   SP6    1 0.008 0.002  Sequence20
10     G2   Sp1    0 0.004 0.005  Sequence17
11     G2   SP1    0 0.050 0.600  Sequence18
12     G2   SP1    0 0.400 0.600   Sequence3
13     G2   SP2    0 0.004 0.005  Sequence22
14     G2   SP2    0 0.004 0.005  Sequence23
15     G2   SP5    0 0.004 0.005  Sequence16
16     G2   SP6    0 0.003 0.002  Sequence21
17     G2   SP7    0 0.560 0.760  Sequence67

这是dput

dput(test_df)
structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("G1", "G2"), class = "factor"), 
    Names = structure(c(2L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 1L, 2L, 
    2L, 3L, 3L, 5L, 6L, 7L), .Label = c("Sp1", "SP1", "SP2", 
    "SP3", "SP5", "SP6", "SP7"), class = "factor"), COL1 = c(1L, 
    1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
    ), COL2 = c(0.4, 0.004, 0.004, 0.4, 0.004, 0.005, 0.4, 0.008, 
    0.004, 0.05, 0.4, 0.004, 0.004, 0.004, 0.003, 0.56), COL3 = c(0.5, 
    0.005, 0.005, 0.005, 0.5, 0.006, 0.006, 0.002, 0.005, 0.6, 
    0.6, 0.005, 0.005, 0.005, 0.002, 0.76), COL4 = structure(c(1L, 
    8L, 13L, 2L, 3L, 4L, 5L, 9L, 6L, 7L, 13L, 11L, 12L, 5L, 10L, 
    14L), .Label = c("Sequence1", "Sequence123", "Sequence14", 
    "Sequence15", "Sequence16", "Sequence17", "Sequence18", "Sequence2", 
    "Sequence20", "Sequence21", "Sequence22", "Sequence23", "Sequence3", 
    "Sequence67"), class = "factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "10", "11", "12", "13", "14", 
"15", "16", "17"))

并从这个数据框中我想得到另一个数据框,例如:

    G1  G2
SP1 A   B
SP2 x   x
SP3 x   NA
SP4 NA  NA
SP5 A   X
SP6 a x
SP7 NA b

这个想法是让每个组添加行中存在的名称并在单元格中添加字母 A、B、X 或 NA,如果我们在 anotger 中找到至少一个物种的相同 COL4 值,则大写或小写将取决于团体。

让我们举4个例子:

1)我们看到G1-SP1row1一个COL1 > 0,那么它将有一个字母Aa在新的数据框中。现在为了知道它是 anA还是 ana我们必须查看 the COL4,我们看到row12the Sequence3中也存在G2for the SP1,所以它将是一个 'A'

2)我们看到G2-SP1row12aCOL2COL3are > 0.05,那么它将有一个字母Bb在新的数据框中。这将是B因为在SP1的G2G1中也存在 。row3Sequence3

3)我们看到G2-SP2none 行有COL1 >0XorCOL2COL3are > 0.05,那么它将在新数据框中有一个字母Bor x。这将是x因为SP2其他Groups人都没有相同的序列`(Sequence22,Sequence23或Sequence24)

4)我们看到G1-SP6row8一个COL1 > 0,那么它将有一个字母Aa在新的数据框中。这将是a因为其他人中没有其他SP1Groups具有相同的序列(Sequence20)

`

感谢 Dan Chaltiel:使用 dplyr 根据阈值创建新的数据帧我得到了不包含小写/大写变量的代码:

test_df %>% 
  group_by(Groups, Names) %>% 
  summarise(
    x=case_when(
      any(COL1>=1, na.rm=TRUE) ~ "A",
      any(COL1==0 & (COL2>0.05 & COL3>0.05), na.rm=TRUE) ~ "B",
      any(COL1==0 & (COL2<0.05 | COL3<0.05), na.rm=TRUE) ~ "X",
      TRUE ~ NA_character_
    )
  ) %>% 
  pivot_wider(names_from = Groups, values_from = x)

使用此代码,我可以得到:

    G1  G2
SP1 A   B
SP2 X   X
SP3 X   NA
SP4 NA  NA
SP5 A   X
SP6 A X
SP7 NA B

标签: rdataframedplyr

解决方案


推荐阅读