如何解决将R函数应用于多个列并生成输出
当前,我正在尝试根据另一个值生成一个新的数据框。
我的旧数据框具有每个变量和观察值的平均值,如下所示:
var1 var2 var3
#1: 2.1 3.4 2.7
#2 1.1 3.6 2.2
#3 2.9 1.7 2.7
data <- structure(list(var1 = c(2.1,1.1,2.9),var2 = c(3.4,3.6,1.7
),var3 = c(2.7,2.2,2.7)),class = "data.frame",row.names = c(NA,-3L))
我的目标是创建一个数据框,其中原始数据框中的每个观测值应包含10个观测值。这些观察结果应复制平均值。看起来应该像这样
var 1 var 2 var 3
#1 2 3 2
#1 2 3 2
#1 2 3 2
#1 2 3 3
#1 2 3 3
#1 2 3 3
#1 2 4 3
#1 2 4 3
#1 2 4 3
#1 3 4 3
现在创建这些观测值,我正在使用此功能:
my_func <- function(y){
wert <- y
werte <- wert
werte2 <- floor(werte)
werte3 <- floor(werte)+1
werte4 <- round((werte-werte2)*10)
werte5 <- round(10-(werte-floor(werte))*10)
y <- as.vector(rep(werte2,werte5))
z <- as.vector(rep(werte3,werte4))
b <- c(y,z)
b
}
然后,我将此功能应用于数据并将其存储到列表中:
myList<- list()
for (i in 1:ncol){
pp <- lapply(data[,i],my_func)
myList[[i]] <- pp
}
不幸的是,我在执行此操作时遇到错误:
Error in rep(werte2,werte5) : invalid 'times' argument
Called from: as.vector(rep(werte2,werte5))
是否可以解决此问题或更好的方法?
解决方法
尝试一下:
my_func <- function(x) {
int_x <- as.integer(floor(x))
dec_x <- as.integer(x * 10 - int_x * 10)
out <- vapply(
seq_along(x),function(i,a,b) rep(a[[i]],10L) + c(rep(0L,10L - b[[i]]),rep(1L,b[[i]])),integer(10L),int_x,dec_x
)
`attributes<-`(out,NULL)
}
as.data.frame(lapply(df,my_func))
输出
> as.data.frame(lapply(df,my_func))
var1 var2 var3
1 2 3 2
2 2 3 2
3 2 3 2
4 2 3 3
5 2 3 3
6 2 3 3
7 2 4 3
8 2 4 3
9 2 4 3
10 3 4 3
11 1 3 2
12 1 3 2
13 1 3 2
14 1 3 2
15 1 4 2
16 1 4 2
17 1 4 2
18 1 4 2
19 1 4 3
20 2 4 3
21 2 1 2
22 3 1 2
23 3 1 2
24 3 2 3
25 3 2 3
26 3 2 3
27 3 2 3
28 3 2 3
29 3 2 3
30 3 2 3
,
我认为您需要这样的功能:
unmean <- function(vec,n = 10) {
as.numeric(sapply(vec,function(x) {
c(rep(floor(x),round(n * (1 - x %% 1))),rep(ceiling(x),round(n * (x %% 1))))
}))
}
这使您可以执行以下操作:
unmean(2.5,n = 2)
#> [1] 2 3
unmean(3.2,n = 5)
#> [1] 3 3 3 3 4
unmean(c(2.1,6.7),10)
#> [1] 2 2 2 2 2 2 2 2 2 3 6 6 6 7 7 7 7 7 7 7
因此对于您的解决方案,您可以这样做:
as.data.frame(lapply(data,unmean))
#> var1 var2 var3
#> 1 2 3 2
#> 2 2 3 2
#> 3 2 3 2
#> 4 2 3 3
#> 5 2 3 3
#> 6 2 3 3
#> 7 2 4 3
#> 8 2 4 3
#> 9 2 4 3
#> 10 3 4 3
#> 11 1 3 2
#> 12 1 3 2
#> 13 1 3 2
#> 14 1 3 2
#> 15 1 4 2
#> 16 1 4 2
#> 17 1 4 2
#> 18 1 4 2
#> 19 1 4 3
#> 20 2 4 3
#> 21 2 1 2
#> 22 3 1 2
#> 23 3 1 2
#> 24 3 2 3
#> 25 3 2 3
#> 26 3 2 3
#> 27 3 2 3
#> 28 3 2 3
#> 29 3 2 3
#> 30 3 2 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。