Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中用ifelse突变_R_If Statement_Dplyr_Mutate - Fatal编程技术网

在r中用ifelse突变

在r中用ifelse突变,r,if-statement,dplyr,mutate,R,If Statement,Dplyr,Mutate,我正在制作一个数据帧(尺寸:10155×33)。数据框中很少有行和列是 rg[1:3, 1:4] REF_NO children age_band status 1 2148 1 45-50 Partner 2 8099 1 61-65 Partner 3 6611 3 31-35 Partner > table(rg_age_band) 18-21 22-25 26-30 31-35

我正在制作一个数据帧(尺寸:10155×33)。数据框中很少有行和列是

  rg[1:3, 1:4]

  REF_NO children age_band  status
1   2148        1    45-50 Partner
2   8099        1    61-65 Partner
3   6611        3    31-35 Partner


> table(rg_age_band)

  18-21   22-25   26-30   31-35   36-40   41-45   45-50   51-55 
     63     456     927    1061    1134    1112    1359    1052 
  55-60   61-65   65-70     71+ Unknown 
   1047     881     598     410      55 
对于变量age_band,我想使用tidyverse函数separate()、mutate()和chaining运算符进行以下嵌套操作:

  • 将年龄带分为两列a1和a2
  • 将a1列中的“71+”替换为“71”
  • 将列a1和a2转换为数值类
  • 创建一列“age”,它是a1和a2列的平均值
  • 下拉列a1和a2
  • 我正在使用以下代码:

    library(tidyr); library(dplyr)
    
    rg1=rg %>% 
      separate(age_band, into = c("a1", "a2"), sep="-") %>% 
      mutate(a1 = as.numeric(ifelse(rg$a1=="71+", 71, rg$a1)),
             a2 = as.numeric(a2),
             age = 0.5*(a1+a2)) %>% 
      select(-a1-a2)
    
    Error: Column `a1` must be length 10155 (the number of rows) or one, not 0 
    
    错误:列
    a1
    必须是长度10155(行数)或1,而不是0
    请建议可以执行的操作。 当我在ifelse语句中不使用“$”的情况下运行代码时,我会得到一个错误未找到对象“a1”,而通常,在使用链式操作符&mutate时,我们不需要“$”。 关于这个问题的讨论无法给出任何有用的解决方案。 我尝试了一些代码,问题是

    mutate(a1 = as.numeric(ifelse(rg$a1=="71+", 71, rg$a1))
    


    编辑:附加一个

    以下代码不会产生任何错误:

    rg <- data.frame(REF_NO = c(2148, 8099, 6611), children = c(1,1,3), age_band = c("45-50", "61-65", "71+"))
    
    rg %>% 
      tidyr::separate(age_band, into = c("a1", "a2"), sep="-") %>% 
      mutate(a1 = as.numeric(ifelse(a1=="71+", 71, a1)),
             a2 = as.numeric(a2),
             age = 0.5*(a1+a2)) %>% 
      select(-a1, -a2)
    
    rg%
    tidyr::分开(年龄段,分为=c(“a1”、“a2”)、sep=“-”%>%
    变异(a1=as.numeric(如果其他(a1==“71+”,71,a1)),
    a2=作为数字(a2),
    年龄=0.5*(a1+a2))%>%
    选择(-a1,-a2)
    
    在调用mutate时,a1尚未创建,因此rg$a1为NULL或长度为零;因此ifelse的长度为零。它是由tidyr中的separate()函数创建的。在我看来,您不应该需要
    rg$a1
    ,只需尝试使用:
    as.numeric(ifelse(rg$a1==“71+”,71,a1))
    。可能还有别的问题……这对我也有好处。然而,当我一点一点地运行我的代码[有或没有“$”]时[例如,每次都有一条语句在里面变化],代码的各个部分都在工作。但是在一起运行整个块时,我会遇到前面提到的错误。奇怪的行为,我无法理解。那么,您的数据中可能有其他东西造成了麻烦。你能试着一次运行一千行吗:
    rg[1:1000,]%>%…
    并试着缩小范围吗?也许在你的问题中包含一个更大的数据摘录?我附上了一个示例数据。使用此示例,我仍然无法使用上面提供的代码重现任何错误。警告用于解释在您的数据中引入的NA:
    1:预期2个。在237行[9,73,98,115,164,165,181,202,233,250,257,286,311,323,341,368,372,381,383,400,…]中填充了
    NA`的缺失片段。如果a1是“未知”的,则警告您对于“71+”a2变量是NA。
    2:NAs由强制引入
    是来自
    as.numeric
    操作的警告
    rg <- data.frame(REF_NO = c(2148, 8099, 6611), children = c(1,1,3), age_band = c("45-50", "61-65", "71+"))
    
    rg %>% 
      tidyr::separate(age_band, into = c("a1", "a2"), sep="-") %>% 
      mutate(a1 = as.numeric(ifelse(a1=="71+", 71, a1)),
             a2 = as.numeric(a2),
             age = 0.5*(a1+a2)) %>% 
      select(-a1, -a2)