当前位置: 首页 > 知识库问答 >
问题:

在 R 中,根据独占条件创建多个新变量

葛磊
2023-03-14

我需要帮助完成一项看似简单的任务。我想基于< code>dplyr::mutate中的一个条件创建几个新变量。我可以使用< code>ifelse创建一个新变量,但是我想一步创建几个。

让我们假设这是我的数据帧。

df_have <- data.frame(id = 1:10, x = 1:2, y = sample(10, replace = T))

我想要这样的东西:

df_want <- mutate(df_have,
                  if_else(y<3, var1 = x, var2 = y/x, var3 = T)) 

因此,if条件应该基于条件< code>y创建三个新变量

我想与< code>if_else和< code>case_when一起使用。

谢谢转发

共有2个答案

越学博
2023-03-14

像这样一次创建所有的变量,尽管坦白地说我不推荐这样做!:

func <- function(x,y) {
  if(y<3) list("var1"=x,"var2"=y/x,"var3"=T)
  else(list("var1"=NA, "var2"=NA, "var3"=NA))
}
df_have %>%
  rowwise() %>% 
  mutate(vars=list(func(x,y))) %>%
  unnest_wider(col = vars)

输出:

      id     x     y  var1  var2 var3 
   <int> <int> <int> <int> <dbl> <lgl>
 1     1     1     7    NA    NA NA   
 2     2     2     2     2     1 TRUE 
 3     3     1     5    NA    NA NA   
 4     4     2     3    NA    NA NA   
 5     5     1     1     1     1 TRUE 
 6     6     2     3    NA    NA NA   
 7     7     1     5    NA    NA NA   
 8     8     2     4    NA    NA NA   
 9     9     1     2     1     2 TRUE 
10    10     2     4    NA    NA NA  

这样做要快得多:

df_have %>% 
  mutate(
    var1=if_else(y<3, x, as.integer(NA)),
    var2=if_else(y<3, y/x, as.double(NA)),
    var3 =if_else(y<3, T, as.logical(NA))
  )
齐航
2023-03-14

您可以在mutate中为每个新变量单独使用< code>case_when。请注意,所有< code>case_when案例的输出需要是相同的类型,因此< code>NA_??_类型可能需要根据实际数据进行调整。

set.seed(20)
df_have <- data.frame(id = 1:10, x = 1:2, y = sample(10, replace = T))

df_have %>%
  dplyr::mutate(
    var1 = case_when(y < 3 ~ x,
                     TRUE ~ NA_integer_),
    var2 = case_when(y < 3 ~ y/x,
                     TRUE ~ NA_real_),
    var3 = case_when(y < 3 ~ TRUE,
                     TRUE ~ FALSE)
  )

#   id x y var1 var2  var3
#1   1 1 6   NA   NA FALSE
#2   2 2 8   NA   NA FALSE
#3   3 1 2    1    2  TRUE
#4   4 2 9   NA   NA FALSE
#5   5 1 2    1    2  TRUE
#6   6 2 9   NA   NA FALSE
#7   7 1 3   NA   NA FALSE
#8   8 2 9   NA   NA FALSE
#9   9 1 8   NA   NA FALSE
#10 10 2 2    2    1  TRUE
 类似资料:
  • 我想在多个data.tables(或data.frames)中执行相同的操作。例如,我想在所有data.tables中的相同规则上创建相同的变量条件。 列表.df 我的(坏的)试探性的: 很明显,不能像我现在所做的那样创建这个新变量,因为我会收到一条错误消息“Object not found”。有没有关于如何修复我的坏代码的线索?我有一种感觉可以帮助我,但我不知道如何帮助我。

  • 我有数据集,我需要调整通货膨胀的多个变量。它看起来像这样。 我需要把这些都放在一个恒定的格式中(比如2020美元)。我可以用< code>priceR包中的< code > adjust _ for _ inflation 函数很容易地做到这一点。然而,有很多价格变量,所以我想自动创建它们。我一直在尝试使用< code > cross ,但它不起作用。以下是我一直在尝试的。 据我所知,这应该是一个

  • 最近没有使用当前tidyverse动词来回答这个问题(R 4.1 所需的输出应如下所示。感谢您对此的任何帮助!

  • 我有一个数据集,其中有大量表示过程代码的字符串列变量。还有另一列变量表示编码格式(有些是ICD9,有些是其他更神秘的格式)。每次观察都是一个病人。我需要: 搜索每个带有特定前缀的变量名 确保正在使用的代码是ICD9代码(由“02”表示)。 查找这些代码中哪些与特定字符串的前3个字符匹配 如果有任何变量以这三个字符开头,则创建一个新列变量=1,如果没有匹配,则创建一个新列变量=0 变量太多了,通过c

  • 我正在为一个大的数据集创建条件平均值,这个数据集包含了几年来一周内看到的流感病例数。数据是这样组织的: 我想做的是创建一个新的列,列出往年同一周的平均病例数。例如,对于Week所在的行。数字是1和流感。今年是2017年,我希望新行给出任何一年的平均计数。数字==1 但是,由于有四年的数据* 52周,因此需要大量迭代才能阐明条件。有没有办法在dplyr中优雅地编码它?我经常遇到的问题是,我想根据周.

  • 我有一个在不同医院接受治疗的病人的数据集(仅限于住院病人),其中一些分析揭示了几个不一致之处。其中之一是--软件允许病人在不关闭他们之前开放的的情况下入院。 为了更好地理解它,让我们考虑一下示例数据集 如果我们在上面的数据中看到,id为1的患者于1月1日在hospital_1(row-1)入院,并于1月14日出院。出院前患者再次在同一医院入院(第2行);在1月15日(第2行)结束这四项记录之前,再