我已经阅读了一些有关Apply函数的主题,但我仍在为该应用程序而苦苦挣扎。我想在一个数据帧中生成一个虚拟变量,如果在另一个数据帧的观察中存在两个变量值的组合,则该变量将取值为1。
创建两个数据框:
df1 <- data.frame(c("A","C","E","F"),
c(17,24,5,8))
names(df1)[1] <- "Apple"
names(df1)[2] <- "Orange"
df1$Apple <- as.character(df1$Apple)
df1$Banana <- 0
df2 <- data.frame(c("Q","A","C","E"),
c(8,303,24,17))
names(df2)[1] <- "Tomato"
names(df2)[2] <- "Cucumber"
df2$Tomato <- as.character(df2$Tomato)
两个数据帧中唯一存在的观测值是“ C”,即24,它位于df1的第2行和df2的第3行。我可以使用for循环提取此信息,为第一个变量创建一个变量等效的子集,并检查数据集中是否存在第二个变量的相同值:
for(idx in 1:4){
df3 <- subset(df2, Tomato == df1$Apple[idx])
df1$Banana[idx] <- df1$Orange[idx] %in% df3$Cucumber
}
这将导致预期的结果:
> df1
Apple Orange Banana
1 A 17 0
2 C 24 1
3 E 5 0
4 F 8 0
但是,我无法通过apply函数获得相同的结果:
Banana <- function(){
df3 <- subset(df2, Tomato == df1$Apple)
df1$Orange %in% df3$Cucumber
}
apply(X = df1, MARGIN = 1, FUN = Banana)
相反,我收到以下错误消息:
FUN(newX [,i],...)中的错误:未使用的参数(newX [,i])
有人知道吗,我在这里做错了什么以及如何正确使用该功能?
答案 0 :(得分:1)
使用apply
的一种方法是逐行迭代df1
并检查是否有任何行的第一个值等于Tomato
,第二个值等于Cucumber
并分配整数值相应。
df1$Banana <- as.integer(apply(df1, 1, function(x)
any(x[1] == df2$Tomato & x[2] == df2$Cucumber)))
df1
# Apple Orange Banana
#1 A 17 0
#2 C 24 1
#3 E 5 0
#4 F 8 0