【问题标题】:Nested `ifelse` statements in R [closed]R中的嵌套`ifelse`语句[关闭]
【发布时间】:2016-02-03 00:40:19
【问题描述】:

我有以下格式的数据,并正在尝试创建一个新变量,其中包括每次观察的死亡总数,其中“存在”表示正在进行的事件:

    Birth1  Death1  Birth2  Death2  Birth3  Death3  Birth4  Death4  Birth5  Death5  Birth6  Death6
  1 1990    present                                     
  2 1984    1986    1986    present                             
  3 1985    1988    1988    present                             
  4 1987    1991    1991    1994    1996    present                     
  5 1987    1989    1989    present                             

我尝试了data$num.deaths <- ifelse(data$death1=="present", 0, 1),但显然这并没有得到有多个死亡事件的观察结果。我也尝试了嵌套 ifelse 但得到了相同的结果。任何人都可以指出一种快速有效的方法吗?

【问题讨论】:

  • 你能不能dput你的数据,或者至少head你的数据。
  • 请使用dput分享您的数据。不是你的数据是矩阵还是数据框,它是什么类等等。
  • 您的数据中的空白区域(例如,观察 A 和出生 2)是否不适用?如果数据列有缺失值,则不能直接使用ifelse中的逻辑函数。
  • 所以不要分享全部内容!执行dput(droplevels(data[1:6, 1:6])) 之类的操作,但选择一些说明问题的行和列。
  • dput() 有什么问题?

标签: r function if-statement for-loop nested


【解决方案1】:

提取代表死亡的列给出Deaths,然后在每一行中将非 NA、非空字符串且不等于 "present" 的元素的数量相加。没有使用任何包。

Deaths <- data[grep("Death", names(data))]
rowSums(!is.na(Deaths) & Deaths != "" & Deaths != "present")
## A B C D 
## 0 1 1 2 

给出相同结果的最后一行代码的替代方法是检查每行的每个单元格是否有数字并将每行中的成功加起来 -- apply 将行转换为列,因此我们使用 @ 987654325@ 这样做。

colSums(apply(Deaths, 1, grepl, pattern = "\\d"))

注意:最好在您的问题中显示dput(data) 的输出,以明确且可重复地传达您的输入。否则,您所拥有的内容与假设的答案之间可能存在细微差异,因此出于可重复性的目的,我们将其用作输入(对应于修改之前问题中显示的原始输入数据和示例输出):

data <- 
structure(list(Birth1 = c(1990L, 1984L, 1985L, 1987L), Death1 = c("present", 
"1986", "1988", "1991"), Birth2 = c(NA, 1986L, 1988L, 1991L), 
    Death2 = c("", "present", "present", "1994"), Birth3 = c(NA, 
    NA, NA, 1996L), Death3 = c("", "", "", "present")), .Names = c("Birth1", 
"Death1", "Birth2", "Death2", "Birth3", "Death3"), 
class = "data.frame", row.names = c("A", "B", "C", "D"))

看起来像这样:

> data
  Birth1  Death1 Birth2  Death2 Birth3  Death3
A   1990 present     NA             NA        
B   1984    1986   1986 present     NA        
C   1985    1988   1988 present     NA        
D   1987    1991   1991    1994   1996 present

【讨论】:

    【解决方案2】:

    这是Reduce+ 的另一个选项。我们循环使用lapply 遍历列,通过检查元素是否仅包含非数将元素转换为二进制(0/1),然后使用Reduce 我们将每一行的相应元素相加。

    Reduce(`+`,lapply(data[grep('Death', names(data))], 
                    grepl, pattern='^\\d+$'))
    #[1] 0 1 1 2
    

    注意:该示例取自@G 中的dput 输出。格洛腾迪克的帖子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多