【问题标题】:Replace for loop by apply function用 apply 函数替换 for 循环
【发布时间】:2019-09-21 11:00:01
【问题描述】:

我已经阅读了一些关于应用函数的主题,但我仍在为应用程序而苦苦挣扎。我想在数据框中生成一个虚拟变量,如果在另一个数据框的观察中存在两个变量值的组合,则该变量取值为 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])

有谁知道,我在这里做错了什么以及如何正确使用该功能?

【问题讨论】:

  • 附带说明,您可以像这样在一行中构造您的 data.frame:df1 &lt;- data.frame(apple=c("A","C","E","F"), orange=c(17,24,5,8), stringsAsFactors=FALSE)

标签: r


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多