2015-10-05 39 views
0

我试图做类似下面的操纵另一个列表:检查,如果我在数据帧元素作为R

x<-c(1:10) 
df<-data.frame(x) 
df['y']<-NA 
intersections<-c(3,6,9) 
values<-c('hello','hi','bye') 
inset<-data.frame(intersections,values) 
df['y']<-ifelse(df['x'] %in% inset$intersections, inset$values,NA) 

,我想我的输出看起来像:

df 
x, y 
1, NA 
2, NA 
3, 'hello' 
4, NA 
5, NA 
6, 'hi' 
7, NA 
8, NA 
9, 'bye' 

请指点?

感谢这么多,而不是使用ifelse

回答

0

变化在你的代码下面,它的工作原理

inset <- data.frame(intersections,values, stringsAsFactors = FALSE) 
df$y <- ifelse(df$x %in% inset$intersections, inset$values, NA) 
+0

我喜欢你的解决方案的优雅,你能解释一下stringsAsFactors的用途吗?谢谢 – Henry

+0

值将被设置为一个因素,如果你只是创建数据帧插入。 ifelse然后会输入1而不是文本值。通过将stringAsFactors设置为FALSE,可以避免此问题。 – phiver

0

,试试这个:

merge(df, inset, all.x = TRUE, by.x = "x", by.y = "intersections") -> df$y 
+0

在现实中我的X是十万10S行,Y只有少数(〜8) - 但这些值重复(和日期)。合并真的是解决这个问题的最简单方法吗? 谢谢 – Henry

+0

有很多方法可以解决这个问题 - 合并只是一个。计算时间在这里不是问题 - 你的数据集还是比较小的。 – Chris

+0

我同意,计算时间在这里并不重要。我会给它一个 - 它被日期(等)稍微混淆了。 – Henry