【问题标题】:Create new column using condition on another existing column在另一个现有列上使用条件创建新列
【发布时间】:2017-12-09 22:30:39
【问题描述】:

我有这样的数据

Time    chamber
9       1
10      2
11      3
12      4
13      5
14      6
15      7
16      8
17      9
18      10
19      11
20      12
21      1
22      2
23      3
24      4

我想使用另一个现有列(室)上的条件创建一个新列。

它应该看起来像这样

Time    chamber treatment
9       1       c2t2
10      2       c2t2
11      3       c0t0r
12      4       c2t2r
13      5       c2t2r
14      6       c0t0
15      7       c0t0r
16      8       c0t0r
17      9       c2t2
18      10      c2t2r
19      11      c0t0
20      12      c0t0
21      1       c2t2
22      2       c2t2
23      3       c0t0r
24      4       c2t2r
  • 对于腔室 1、2、9:处理为 c2t2
  • 对于腔室 3、7、8:处理为c0t0r
  • 对于腔室 4、5、10:处理为 c2t2r
  • 对于腔室 6、11、12:处理为 c0t0

我也做了一个查找表,但是不知道怎么用:

lookup_table <- data.frame(row.names = c("1", "2", "3","4", "5", "6","7", "8", "9","10", "11", "12"),
                           new_col = c("C2T2", "C2T2", "C0T0R","C2T2R", "C2T2R", "C0T0","C0T0R", "C0T0R", "C2T2","C2T2R", "C0T0", "C0T0"), 
                           stringsAsFactors = FALSE)    

【问题讨论】:

标签: r dplyr


【解决方案1】:

假设“dt”是您的dataframe 名称,那么您可以将dplyrcase_when 一起使用

library(tidyverse)
dt %>% 
  mutate(newcol = case_when(dt$chamber %in% c(1, 2, 9) ~ "c2t2",
                            dt$chamber %in% c(3, 7, 8) ~ "c0t0r",
                            dt$chamber %in% c(4, 5, 10) ~ "c2t2r",
                            dt$chamber %in% c(6, 11, 12) ~ "c0t0"))

输出

   Time chamber newcol
1     9       1   c2t2
2    10       2   c2t2
3    11       3  c0t0r
4    12       4  c2t2r
5    13       5  c2t2r
6    14       6   c0t0
7    15       7  c0t0r
8    16       8  c0t0r
9    17       9   c2t2
10   18      10  c2t2r
11   19      11   c0t0
12   20      12   c0t0
13   21       1   c2t2
14   22       2   c2t2
15   23       3  c0t0r
16   24       4  c2t2r
> 

【讨论】:

  • @Kathiravan Meeran,如果它对您有用,请点击复选标记接受答案
  • 对不起,我不知道我是这个 stackoverflow 的新手。
  • 没问题,没问题
【解决方案2】:

您可以将dflookup_table 合并。根据我的经验,如果你想组合不同的 data.frame,merge() 是我喜欢使用的命令。请注意,您可以将许多不同的方法和专门的软件包用于相同的目的!

您需要指定使用哪一列作为“匹配列”,并且您希望将所有记录保留在df

merge(df, lookup_table, all.x = TRUE, by.x = "chamber", by.y = "row.names")

数据:

df <- structure(list(Time = 9:24, chamber = c(1L, 2L, 3L, 4L, 5L, 6L, 
                     7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L)), 
                    .Names = c("Time", "chamber"), class = "data.frame", 
                    row.names = c(NA, -16L))
lookup_table <- structure(list(new_col = c("C2T2", "C2T2", "C0T0R", "C2T2R", 
                                          "C2T2R", "C0T0", "C0T0R", "C0T0R", 
                                          "C2T2", "C2T2R", "C0T0", "C0T0")), 
                                .Names = "new_col", 
                                row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"), class = "data.frame")

【讨论】:

  • 嗨,Ken S。感谢您的解决方案。我试过了,但最终只得到了 12 行而不是 16 行。我想我不应该使用查找表来解决这个问题。但是感谢您对合并两个数据框的建议。
猜你喜欢
  • 2020-12-14
  • 2022-01-07
  • 1970-01-01
  • 2017-12-28
  • 2018-10-24
  • 2020-09-18
  • 2023-03-25
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多