有条件地替换两个数据帧以构造新变量

时间:2015-02-10 14:40:51

标签: r dataframe

在我的数据中,我构建了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导入我的数据。因此,如果没有因素会更容易,请告诉我。

我确信这是一件我想念的简单......

1 个答案:

答案 0 :(得分:1)

对于一般情况:

数据

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