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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R - 创建几列非零最小值的新列相关的知识,希望对你有一定的参考价值。

我正在尝试使用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然后再次用零替换NAs。只有在表的其余部分没有NAs时,这才有效。

我稍微扩展了你的数据框:

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 - 创建几列非零最小值的新列的主要内容,如果未能解决你的问题,请参考以下文章

在 str.split 操作后创建具有最后 2 个值的新列

基于字典键创建具有值的新列

如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?

Pandas - 在保留原始列的同时创建具有替换值的新列

R:每列最小值的行号

Python如何在pandas数据框中提取[]括号内的指定字符串并创建一个具有布尔值的新列