【发布时间】: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