两个数据帧之间的条件替换以构造新变量

Conditional Replacement between two dataframes to construct new variable

在我的数据中,我为 data.frame 内的所有观测值构建了综合估计值。但是,对于某些观察结果,我想使用观察值而不是综合估计值。在我的真实数据中,观察到的信息因年份、作物类型和县而异。所以我试图构建一些通用的东西,可以用来根据实际观察到的内容有条件地替换这些信息。我做了一个简单的例子来向你展示我的意思。

#Ideal Example: It works because everything is in the proper order
set.seed(1234)

df <- data.frame(Name = LETTERS[1:8], Estimated = 5*rnorm(8))
df

alt.df <- data.frame(Name = c('A', 'F'), Observed = 3*runif(2))
alt.df

df$Combined[df$Name %in% alt.df$Name] <- alt.df$Observed
df$Combined[is.na(df$Combined)]  <- df$Estimated[is.na(df$Combined)]
df

#Example doesn't work because the order of alt.df$Name is set as (F, A)
set.seed(1234)

df <- data.frame(Name = LETTERS[1:8], Estimated = 5*rnorm(8))
df

alt.df <- data.frame(Name = c('F', 'A'), Observed = 3*runif(2))
alt.df

#Error is that values fo "F" = 0.85.. is input as value for "A"
df$Combined[df$Name %in% alt.df$Name] <- alt.df$Observed
df$Combined[is.na(df$Combined)]  <- df$Estimated[is.na(df$Combined)]
df

过去几天我一直在努力解决这个问题,并且认真研究了其他 Stack Overflow 帖子,包括:

Replace a value in a data frame based on a conditional (`if`) statement in R

Changing values in list if that value meets criteria in R

和许多其他人。

他们有大量信息,我已经研究了他们的示例,但我仍然无法弄清楚如何将他们的解决方案推广到我的情况,因为我不是要替换单个值,而是要从另一个数据中提取信息设置(可能会有所不同)并构造一个新变量,该变量将合成信息和观察到的信息合并到一个与标识符(在简单示例中为字母)匹配的单个变量中。在这个简单的例子中,我已经包括了因素,但我不必有因素,实际上目前使用选项 stringsAsFactors = FALSE 导入我的数据。所以如果没有因素更容易,请告诉我。

我确定我错过了一些简单的东西...

对于一般情况:

数据

set.seed(1234)

df <- data.frame(Name = LETTERS[1:8], Estimated = 5*rnorm(8))
alt.df <- data.frame(Name = c('A', 'F'), Observed = 3*runif(2))

您正在寻找的基本上是根据 Name 键进行的合并。这可以通过库 data.table:

来完成
library(data.table)

setDT(df)
setDT(alt.df)
setkey(alt.df, Name)

dt=alt.df[df]
transform(dt, Combined=ifelse(is.na(dt$Observed), dt$Estimated, dt$Observed))
#   Name  Observed  Estimated    Combined
#1:    A 0.8586699  -6.035329   0.8586699
#2:    B        NA   1.387146   1.3871462
#3:    C        NA   5.422206   5.4222059
#4:    D        NA -11.728489 -11.7284885
#5:    E        NA   2.145623   2.1456234
#6:    F 0.8004623   2.530279   0.8004623
#7:    G        NA  -2.873700  -2.8736998
#8:    H        NA  -2.733159  -2.7331593