两个数据帧之间的条件替换以构造新变量
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
在我的数据中,我为 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