gpt4 book ai didi

r - R-创建几列的非零最小值的新列

转载 作者:行者123 更新时间:2023-12-04 11:10:27 25 4
gpt4 key购买 nike

我试图使用tidyversedplyr创建一个新列,该列是多个其他列的按行非零最小值,如果所有列均为0,则为0。一个简化的示例:

df <- data.frame(
aa = c(0, 0, 0),
bb = c(0, 1, 2),
cc = c(2, 5, 3)
)


新列应为2、1和2。在这种情况下,以下代码可以工作,但是对于较大的data.frames,它的运行速度非常慢。

df2 <- df %>% 
select(aa, bb, cc) %>%
rowwise() %>%
do( (.) %>% as.data.frame %>% mutate(minOver0 = ifelse(sum(.)==0,0,min(.[. > 0]))) ) %>%
ungroup


我该怎么做才能加快速度?

最佳答案

由于您在注释中提到您没有负值,因此我们可以简单地将列中的零替换为NA,然后使用pmin,然后再次将NA替换为零。仅当表的其余部分中没有NA时,此方法才有效。

我向您扩展了数据框架:

df <- data.frame(
aa = c(0, 0, 0,0),
bb = c(0, 1, 2,0),
cc = c(2, 5, 3,0),
dd = c(0,0,0,0)
)


我们的结果现在应该是:c(2,1,2,0)

使用以下代码,我们添加仅包含这些值的列:

df3<-df  # copy the frame
df3[df3 == 0] <- NA # replace zeros by NA, replace by <0 if you want to ignore negative values too
# apply row-wise min function after removing NAs
df3<- df3%>% mutate(minover0= pmin(aa,bb,cc, na.rm = T))
df3[is.na(df3)] <- 0 # and return zeros, including the zero for the last (all-zero) row


我没有检查速度,但是我想这比您问题中的 rowwise()更快。

关于r - R-创建几列的非零最小值的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53699093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com