【问题标题】:IF function to change data in RIF函数来改变R中的数据
【发布时间】:2021-03-01 10:58:27
【问题描述】:

所以,我有一个庞大的谱系,由个人、父母、出生年份和个人后代的平均出生年份组成。 举个例子来说明一下:对于个体 5,出生年份是 1900。这是不可能的,因为它的父母出生于 1975 年和 1977 年。个体 5 也有出生年份的后代。 “修复”缺失或错误的出生年份数据的常用方法是从后代的平均出生年份中减去世代间隔。因此,对于个人 5,后代的平均出生年份是 1983 年,因此 1983 - 5 = 1978。我尝试使用 IF 函数对其进行编码,但由于出现两个错误(粘贴在下面),它不起作用。 case_when 和 mutate 会更好吗?

Indiv <- c(1:10)
Mother <- c(NA, NA, NA, 2, 3, 3, 6, 3, 8, 8)
Father <- c(NA, NA, NA, 1, 1, 1, 5, 4, 4, 9)
YOB <- c(1975, 1975, 1977, 1980, 1900, 1982, 1983, NA, 1988, 1993)
AvgYOBOff <- c(1954, 1981, 1943, 1988, 1983, 1983, NA, 1990.5, 1993, NA)
df <- data.frame(Indiv, Mother, Father, YOB, AvgYOBOff)
L = 5 #generation interval of 5 years

if(df$YOB < df$YOB[match(df$Mother, df$Indiv)] & df$YOB[match(df$Father, df$Indiv)]){
   mutate(df, YOB = AvgYOBOff - L)
}
Error in if (df$YOB < df$YOB[match(df$Mother, df$Indiv)] & df$YOB[match(df$Father,  : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In if (df$YOB < df$YOB[match(df$Mother, df$Indiv)] & df$YOB[match(df$Father,  :
  the condition has length > 1 and only the first element will be used

【问题讨论】:

  • 您正在检查向量的条件,但要改变数据帧?如果你的条件不成立怎么办?
  • 对于个人 1,AvgYOBOff 是 1954,但 YOB 是 1975 - 这是正确的吗?
  • 这与您之前的问题有何不同?
  • @AnilGoyal 如果条件为假,则 YOB 不应更改。我不一定要改变数据框,我只希望 YOB(在数据框中)改变如果后代的生日发生在其父母之前

标签: r dataframe if-statement


【解决方案1】:

您可以先获取YOB 小于对应MotherFather 值的索引,然后用L 减去这些AvgYOBOff 值。

inds <- which(df$YOB < df$YOB[match(df$Mother, df$Indiv)] | 
              df$YOB < df$YOB[match(df$Father, df$Indiv)])

df$YOB[inds] <- df$AvgYOBOff[inds] - L

【讨论】:

    【解决方案2】:

    我也可以使用 ifelse 函数

    df$YOB <- ifelse(df$YOB < df$YOB[match(df$Mother, df$Indiv)] | 
                     df$YOB < df$YOB[match(df$Father, df$Indiv], df$AvgYOBOff - L, df$YOB)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 2016-08-25
      • 2018-03-12
      • 2021-11-05
      相关资源
      最近更新 更多