【问题标题】:Performing sine function and arithmetical operations on a data frame with special columns(columns with lists)对具有特殊列(带列表的列)的数据框执行正弦函数和算术运算
【发布时间】:2018-07-02 11:31:52
【问题描述】:

我有一个带有列表列的数据框 df1

df1 <- data.frame(w= 1:3, x=3:5, y=6:8, z = I(list(1:2, 1:3, 1:4)))

> df1
  w x y          z
1 1 3 6       1, 2
2 2 4 7    1, 2, 3
3 3 5 8 1, 2, 3, 4

通过将 df1 的每隔一列与 z 列相乘,我已将 df1 转换为第二个数据框 df2

df2<- as.data.frame(do.call(cbind, lapply(df[1:3], function(x) Map("*", df$z, x))))

> df2
            w             x             y
1        1, 2          3, 6         6, 12
2     2, 4, 6      4, 8, 12     7, 14, 21
3 3, 6, 9, 12 5, 10, 15, 20 8, 16, 24, 32

我想通过将 df2 乘以 pi 创建第三个数据帧 df3,然后取结果的正弦函数并将正弦输出乘以 4,同时保留数据帧结构。我希望能够以最省时的方法执行操作,因为我正在使用更大的数据框:

df3 <- as.data.frame (4*sin(df2*pi))

考虑到 Map 函数接受的参数不超过两个,我尝试了这样的解决方案,不幸的是它需要无限长的时间:

df3 <- lapply(df2, function(x) Map("*",vol, Map("sin", Map("*",pi, x))))

我将非常感谢有关如何以最省时的方式执行以下操作的任何提示。

df3 <- as.data.frame (4*sin(df2*pi))

我的预期输出是有一个数据框 df3,其中每个元素 与 4*sin(df2[i,k]) 相同。

提前谢谢你。

【问题讨论】:

  • 为什么不对两个以上的参数使用Map(function(a,b,c,d,...,z){}, a,b,c,d,...,z)
  • lapply(z, function(x) Map(function(x){4*(sin(x*pi))}, x)) 给出所需的输出。谢谢。

标签: r dataframe trigonometry


【解决方案1】:

这里不需要MapMap 是自动定义 SIMPLIFY = FALSEmapply 的包装器。对于df3 的创建,您没有多个参数,因此lapply 就足够了:

df3 <- as.data.frame(do.call(cbind, lapply(df2, function(x){
  lapply(x, function(y){
    4*sin(y*pi)
  })
})))

> df3
                                                         w                                                        x
1                              4.898425e-16, -9.796851e-16                              1.469528e-15, -2.939055e-15
2              -9.796851e-16, -1.959370e-15, -2.939055e-15                 -1.95937e-15, -3.91874e-15, -5.87811e-15
3 1.469528e-15, -2.939055e-15, 4.408583e-15, -5.878110e-15 2.449213e-15, -4.898425e-15, 2.155849e-14, -9.796851e-15
                                                           y
1                               -2.939055e-15, -5.878110e-15
2                 3.428898e-15, -6.857796e-15, -3.924161e-15
3 -3.918740e-15, -7.837481e-15, -1.175622e-14, -1.567496e-14

【讨论】:

  • 请问是否可以通过与 C++ 的接口来提供有关如何做到这一点的提示?我认为它会更快。
【解决方案2】:

您可以将df2 展平为向量并在一次调用中执行4*sin(pi*x)relist 帮助转换回初始结构:

df3 <- 4 * sin(unlist(df2) * pi)
df3 <- as.data.frame(
  do.call(cbind, relist(df3, as.list(df2))))

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多