【问题标题】:Running Apply with Function of prime number on data Frame在数据帧上使用素数函数运行应用
【发布时间】:2018-08-06 00:45:15
【问题描述】:

我正在通过使用 apply 对数据帧的行应用素数函数来查找索引数据帧。给定的输出应该保留具有任何或所有数字作为素数的行。示例数据框名称 c4:

c1 c2 c3 1 8 2 6 2 9 5 4 3 10 4 5 4 7 1 8 5 3 1 2 6 7 5 9 7 5 1 4 8 2 1 3 9 7 2 4 10 10 4 8

给定的输出应该是

c1 c2 c3 1 8 2 6 2 9 5 4 3 10 4 5 4 7 1 8 5 3 1 2 6 7 5 9 7 5 1 4 8 2 1 3 9 7 2 4

删除第十行。 我用于素数的代码是

prime.function<- function (x){ if(x == 2){ return(TURE) } else if (any(x %% 2: (x - 1) == 0)){ return(FALSE) }else{ return(TRUE) } }

我在基础索引的应用函数中使用以下函数:

c4[apply(c4, MARGIN = 1, FUN = function(x) any(prime.function(x))),]

但不幸的是,代码抛出错误。

我很想听听有关代码的任何建议。希望我在解释方面很清楚。

【问题讨论】:

  • 首先,prime.function 是检查x 是否为素数的一种非常效率低下的方法。例如,检查直到sqrt(x) 而不是x-1 的数字就足够了。其次,您声明“代码抛出错误”;产生了什么错误?例如,此刻prime.function 有一个错字(TURE 而不是TRUE);还有其他错误吗?在我看来,您想检查行号是否为素数。如果是这样,为什么要遍历整个data.frame?除非我理解错了,df[sapply(1:nrow(df), prime.function), ] 应该足够了。

标签: r dataframe apply


【解决方案1】:

使用这里提供的 prim 函数:Prime number function in R

is.prime <- function(n) n == 2L || all(n %% 2L:max(2,floor(sqrt(n))) != 0)

以下代码将完成这项工作:

# replicate your data frame
c4_check <- c4

# replace the items with booleans in the replicate
c4_check[] <- sapply(unlist(c4), is.prime)

# filter the original data frame using the replicate
c4[rowSums(c4_check) != 0, ]

更新:

@Maurits Evers 在他的评论中的回答要好得多:

c4[sapply(1:nrow(c4), is.prime), ]

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2014-10-03
    • 2017-02-14
    • 2021-03-09
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多