在循环中创建子集或在R中应用函数的更快方法

在循环中创建子集或在R中应用函数的更快方法,r,R,我是R的新手,所以请提前为我代码中的错误形式道歉 我正试图找出最好的方法,逐行遍历数据帧,并根据引用该行或完全不同的数据帧中的其他列的逻辑修改值。问题是,我使用的逻辑需要为每一行创建和子集一个数据帧来检索最小值。我的实际数据集是47000行15列,因此创建47000个子集需要很长时间 下面是一些示例数据集,有助于描述我所说的内容 df1 <- data.frame('A' = c(rep("Beer", 2), rep("Chip", 2)), 'B' = c(NA, 3,

我是R的新手,所以请提前为我代码中的错误形式道歉

我正试图找出最好的方法,逐行遍历数据帧,并根据引用该行或完全不同的数据帧中的其他列的逻辑修改值。问题是,我使用的逻辑需要为每一行创建和子集一个数据帧来检索最小值。我的实际数据集是47000行15列,因此创建47000个子集需要很长时间

下面是一些示例数据集,有助于描述我所说的内容

df1 <- data.frame('A' = c(rep("Beer", 2), rep("Chip", 2)), 'B' = c(NA, 3,
       NA,9), 'C' = 5:8, 'D' = NA)
df2 <- data.frame('Q' = c(rep("Beer", 2), rep("Chip", 2)), 'R' = 6:9, 'S' = 
       c(12, 15, 4, 18), 'T' = c(23, 45, 75, 34)) 
df2:

这个循环实现了我想要的功能,即检查B列中的值是否为NA,如果不是,则在D列中使用该值,如果为NA,则从df2的筛选子集中检索最小值。在实际用例中,我有其他过滤条件

require(dplyr)

for (i in 1:nrow(df1)) {
  if (!(is.na(df1$B[i]))) {
    df1$D[i] <- df1$B[i]}
  else {x <- filter(df2,  df1$A[i] == df2$Q)
      x <- min(x$S)
      df1$D[i] <- x
  }
}
旁白:有没有办法通过名称而不是索引位置引用向量
y
中的项目

那么,有没有更好的方法?现在,两种方法都需要大约5-8分钟来运行47000多行,这对我来说似乎很长

df1$D%
df1$D <- df2 %>% 
  rename(A=Q) %>% 
  group_by(A) %>% 
  summarise(D=min(S)) %>% 
  right_join(df1, by="A") %>% 
  mutate(D=ifelse(is.na(B), D.x, B)) %>% 
  `[[`("D")
重命名(A=Q)%>% 组别(A)%>% 总结(D=分钟))%>% 右键联接(df1,by=“A”)%>% 突变(D=ifelse(is.na(B),D.x,B))%>% `[`(“D”)
是的,您应该能够改进这一点……在两个不同的数据帧中使用数据可能会有一些阻碍。原因是什么?这是使用sqldf进行数据库连接的更大过程中的一个中间步骤。可能有更好的方法在过程的早期阶段引入此值,但我不确定如何进行.
require(dplyr)

for (i in 1:nrow(df1)) {
  if (!(is.na(df1$B[i]))) {
    df1$D[i] <- df1$B[i]}
  else {x <- filter(df2,  df1$A[i] == df2$Q)
      x <- min(x$S)
      df1$D[i] <- x
  }
}
FUNC <- function(x) {
  apply(x, 1, function(y) {
    if (!(is.na(y[2]))) {
      y[4] <- y[2]}
    else {z <- filter(df2,  y[1] == df2$Q)
    z <- min(z$S)
    y[4] <- z}
  }
  )
}

df1$D <- as.numeric(FUNC(df1))
     A    B    C    D
    Beer  NA   5    12
    Beer  3    6    3
    Chip  NA   7    4
    Chip  9    8    9
df1$D <- df2 %>% 
  rename(A=Q) %>% 
  group_by(A) %>% 
  summarise(D=min(S)) %>% 
  right_join(df1, by="A") %>% 
  mutate(D=ifelse(is.na(B), D.x, B)) %>% 
  `[[`("D")