gpt4 book ai didi

r - 选定列的 mutate_each

转载 作者:行者123 更新时间:2023-12-01 13:41:14 30 4
gpt4 key购买 nike

我对使用 mutate_eachfunction 应用到我的 data.frame 有疑问

我有一个函数可以计算两个波 y1y2 之间的相移。我想将此函数应用于我的数据并创建名为 phase 的新列,但我收到一个错误,指出其中一个参数丢失 y2 即使我把它们在我的函数中。

也许我不擅长写函数:)

这是一个可重现的例子:

library(dplyr)
library(psd) # Loaded psd (1.0.1) -- Adaptive multitaper spectrum estimation

time <- seq(1,30)
y1 <- sort(runif(30,-0.014,0.014),decreasing=TRUE)
y2 <- sort(runif(30,-0.012,0.012),decreasing=TRUE)
df <- data.frame(y1,y2,time)
#calculation phase difference between two waves y1 and y2

phase_diff <- function(y1,y2,time){
out1=pspectrum(y1*(-1),x.frqsamp = 0.1);
out2=pspectrum(y2*(-1),x.frqsamp = 0.1);
f1 = out1$freq[which.min(out1$spec)];
f2 <- out2$freq[which.min(out2$spec)];
fit1 <- lm(y1 ~ sin(2*pi*f1*time)+cos(2*pi*f1*time));
fit2 <- lm(y2 ~ sin(2*pi*f2*time)+cos(2*pi*f2*time));
a1 <- fit1$coefficients[2];
b1 <- fit1$coefficients[3];
ph1 <- atan(b1/a1);
a2 <- fit2$coefficients[2];
b2 <- fit2$coefficients[3];
ph2 <- atan(b2/a2);
phase_difference <- as.numeric((ph2-ph1)/pi);
return(phase_difference)
}

dff <- df%>%
mutate_each(funs(phase_diff),phase=c(y1,y2,time))

Stage 0 est. (pilot)
environment ** .psdEnv ** refreshed
detrending (and demeaning)
Stage 1 est. (Ave. S.V.R. -10.9 dB)
Stage 2 est. (Ave. S.V.R. -8.3 dB)
Stage 3 est. (Ave. S.V.R. -8.3 dB)
Stage 4 est. (Ave. S.V.R. -8.3 dB)
Stage 5 est. (Ave. S.V.R. -8.3 dB)
Normalized single-sided psd estimates ( psd ) for sampling-freq. 0.1
Error: argument "y2" is missing, with no default

最佳答案

由于我们需要创建一个新列,并且函数 phase_diff 使用输入数据集中的所有列作为参数,因此 OP 可能需要 mutate 而不是 mutate_each。 mutate_each` 用于应用于数据集中的每一列。

res <- df %>%
mutate(phase = phase_diff(y1, y2, time))
head(res,2)
# y1 y2 time phase
# 1 0.01398857 0.010296090 1 -0.1349023
# 2 0.01334217 0.009990988 2 -0.1349023

以上操作可以使用base R

phase_diff(df$y1, df$y2, df$time)

关于r - 选定列的 mutate_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075232/

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