2015-02-10 31 views
0

在我的数据中,我构建了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 

我已经通过这个挣扎在过去数天,并在其他堆栈溢出的帖子已经看过硬包括:

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

对于一般情况下:

数据

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 
+0

谢谢,我仍然是data.table的新手!这个解决方案看起来很理想,但是当我从一个新的R会话运行你的例子时,我得到了dt的密钥错误。特别是:[.data.table(alt.df,df)中的错误: 当我是一个data.table(或字符向量)时,必须键入x(即排序并标记为排序),以便data.table知道哪些列要加入并利用x进行排序。首先调用setkey(x,...),看到?setkey.'这是否由于'setDT()'命令没有被存储? – Tony 2015-02-10 15:18:22

+0

我在代码中忘记了一行就犯了一个错误!编辑,以便应该为你工作。 – 2015-02-10 15:21:50

+0

感谢您的编辑!这应该很好地工作。 – Tony 2015-02-10 15:23:11

相关问题