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