在 R 中使用 min() 查找最小的后代
Posted
技术标签:
【中文标题】在 R 中使用 min() 查找最小的后代【英文标题】:Find youngest offspring using min() in R 【发布时间】:2021-07-13 17:03:55 【问题描述】:我有一个谱系数据集,对于一些计算和估计,我需要找到一个人最小后代的出生年份。我尝试了 min() 函数,我认为该函数与 match() 一起起着重要作用,以将父 ID 与个人 ID 匹配,但这只会给我 NA 作为答案。有什么想法可以解决这个问题吗?
id <- 1:30
momid <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 1,2,1,2,6,8,6,10,11,13,23,19,16,13,16,20,19,16,19,20,23)
dadid <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 3,4,5,5,7,4,9,7,7,14,24,7,15,18,18,17,21,14,18,21,17)
birthyear <- c(1975, 1975, 1976, 1977, 1977, 1977, 1977, 1978, 1978, 1980, 1981, 1982, 1982, 1984, 1984, 1985, 1985, 1979, 1988, 1989, 1990, 1990, 1991, 1992, 1993, 1993, 1993, 1995, 1995, 1996)
df <- data.frame(id, momid, dadid, birthyear)
min(df$birthyear[match(df$id, df$momid)])
[1] NA
with(df, min(birthyear[match(momid, id)]))
[1] NA
【问题讨论】:
看看你的问题How to calculate the average birthyear of offspring in R和交换mean
和min
:sapply(df$id, function(i) min(df$birthyear[df$momid == i | df$dadid==i], na.rm=TRUE))
@GKi 我曾尝试使用上一个问题中的 sapply 函数,但是,它似乎与我的实际数据集形成了一个无限循环,即 167000 多条记录。我不知道 sapply 函数通常需要多长时间。可能只是我不耐烦了。我会尝试您的解决方案,并耐心等待会发生什么。谢谢!
谢谢!它奏效了,显然我只是不耐烦。
【参考方案1】:
尝试启用na.rm = TRUE
> min(df$birthyear[match(df$id, df$momid)],na.rm = TRUE)
[1] 1979
【讨论】:
感谢有关 na.rm 的说明,我完全忘记了这一点。但是,如果我将它用于整个数据框,那么每个人都会得到 1979,这不是我想要的。我想知道每个人的第一个后代是在哪一年出生的。如果我的问题不清楚,我很抱歉。 @pedigreeanalyst 您是否尝试过 Gki 评论中的答案? 是的,这似乎奏效了!我有点不耐烦,以为它陷入了无限循环。但它奏效了。【参考方案2】:这是@GKi 的答案,所以这不是我自己的答案。但 GKi 将其作为评论发布,因此我将其重新发布为结束问题的答案。
df$firstoffspring <- sapply(df$id, function(i) min(df$birthyear[df$momid == i | df$dadid==i], na.rm=TRUE))
【讨论】:
以上是关于在 R 中使用 min() 查找最小的后代的主要内容,如果未能解决你的问题,请参考以下文章