我有一個看起來像這個例子的資料框(只是大得多):
Name <- c('Peter','Peter','Peter', 'Ben','Ben','Ben','Mary', 'Mary', 'Mary')
var1 <- c(0.4, 0.6, 0.7, 0.3, 0.9, 0.2, 0.4, 0.6, 0.7)
var2 <- c(0.5, 0.4, 0.2, 0.5, 0.4, 0.2, 0.1, 0.4, 0.2)
var3 <- c(0.2, 0.6, 0.9, 0.5, 0.5, 0.2, 0.5, 0.5, 0.2)
df <- data.frame(Name, var1, var2, var3)
df
我拆分了我的資料框,以便將一個函式應用于每個組。
list_split= split(df[,2:4],df$Name)
my_list=vector("list",3)
for (i in seq_along(list_split)){
my_list[[i]]=list(
lapply(list_split[[i]],function(x) summary(x)))
}
之后我撰寫了一個函式,如果“my_list”中值的平均值大于 0.9,則取“split_list”中值的差值,否則只取值。(請忽略操作沒有任何意義,我原來的功能很不一樣。):
l <- list()
fun <- function(x,y) {ifelse(mean(x) > 0.9,diff(y),y)}
for (j in seq_along(list_split)){
for (i in seq_along(my_list)){
u <- mapply(fun,my_list[[i]][[1]],list_split[[j]], SIMPLIFY = FALSE)
l[[j]] <- u
}
}
我希望該函式應用于“list_split”中資料幀中“var”的所有值。例如,list_split[["Ben"]]
這些值為:
var1 var2 var3
4 0.3 0.5 0.5
5 0.9 0.4 0.5
6 0.2 0.2 0.2
但它只是應用于每個 'var' 的第一個值,因此第一個元素的結果串列如下所示:
l[[1]]
$var1
[1] 0.3
$var2
[1] 0.5
$var3
[1] 0.5
那么如何將函式應用于每個“list_split”元素中的所有值,并最終得到一個完全保留“list_split”結構的串列,即資料幀串列?
謝謝!
uj5u.com熱心網友回復:
我們可以試試
Map(\(x, y) {
x[] <- Map(\(u, v) if(mean(v) > 0.9) c(NA, diff(u)) else u, x, y)
x
}, list_split, lapply(my_list, \(x) do.call("c", x)))
-輸出
$Ben
var1 var2 var3
4 0.3 0.5 0.5
5 0.9 0.4 0.5
6 0.2 0.2 0.2
$Mary
var1 var2 var3
7 0.4 0.1 0.5
8 0.6 0.4 0.5
9 0.7 0.2 0.2
$Peter
var1 var2 var3
1 0.4 0.5 0.2
2 0.6 0.4 0.6
3 0.7 0.2 0.9
uj5u.com熱心網友回復:
這是一種方法:
l <- as.list(names(list_split))
fun <- function(x,y) {ifelse(x > 0.9, y-x, y)}
for (j in seq_along(list_split)){
df2 <- df2[0,]
df2 <- data.frame(matrix(ncol = 3, nrow = 3))
names(df2) <- c("var1", "var2", "var3")
for (i in seq_along(list_split[[j]])){
for (h in seq_along(list_split[[j]][[i]])){
u <- mapply(fun,my_list[[j]][[1]][[i]][[4]],list_split[[j]][[i]][[h]], SIMPLIFY = FALSE)
df2[[i]][[h]] <- u
}
}
l[[j]] <- df2
}
names(l) <- names(list_split)
l
這給出了:
$Ben
var1 var2 var3
4 0.3 0.5 0.5
5 0.9 0.4 0.5
6 0.2 0.2 0.2
$Mary
var1 var2 var3
7 0.4 0.1 0.5
8 0.6 0.4 0.5
9 0.7 0.2 0.2
$Peter
var1 var2 var3
1 0.4 0.5 0.2
2 0.6 0.4 0.6
3 0.7 0.2 0.9
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505752.html