循环组合错误 - 函数(多个数据帧)
Error by looping combn - function (multiple Dataframes)
我很难在多个数据帧的函数中获得一个函数。
我有多个数据框:看起来都像
A <- data.frame(Date = as.character(c("Jan-22", "Dec-21", "Nov-21", "Oct-21")),
City1 = seq(1:4),
City2 = seq(1:8))
但是有些数据框有更多的城市(3 到 8 个)。我想 运行 所有数据帧的以下代码:
Dates_A <- A$Date
A$Date <- NULL
nm1 <- combn(names(A), 2, FUN = paste, collapse = "_")
A[nm1] <- combn(A, 2, FUN = function(x) abs(x[[1]]- x[[2]]))
Casava$A<- Dates_A
适用于我的第一个 Dataframe。所以我试着把我所有的数据框放到一个列表中
dfList <- list(A, B, C, D, E)
并将代码放入循环中:
for (i in 1: length(dfList))
{
Dates_i <- dfList[i]$Date
dfList[i]$Date <- NULL
nm1 <- combn(names(dfList[[i]]), 2, FUN = paste, collapse = "_")
dfList[i][nm1] <- combn(dfList[[i]], 2, FUN = function(x) abs(x[[1]]- x[[2]]))
dfList[i] <- select(dfList[[i]], contains("_"))
dfList[i]$Dates <- Dates_i}
但现在我收到错误:
x[[1]] 中的错误 - x[[2]]:二元运算符的非数字参数
有人可以帮忙吗?我对循环不熟悉。
编辑:
抱歉,我在单个 Dataframe 上更正了我 运行 的第一个代码(3 我只是因为我尝试过它 - 现在它不起作用,2 是我想要的)。
我的代码只在循环中中断
dfList[i][nm1] <- combn(dfList[[i]], 2, FUN = function(x) abs(x[[1]]- x[[2]]))
我会略有不同。我会将所有内容包装在一个函数中并应用,即
f1 <- function(df){
cbind.data.frame(df,
lapply(combn(df[-1], 2, simplify = FALSE), function(i) {
nm <- paste0(names(i[1]), '_', names(i[2]));
i[nm] <- i[1] - i[2];
i[3]}))
}
> f1(A)
Date City1 City2 City3 City1_City2 City1_City3 City2_City3
1 Jan-22 1 1 1 0 0 0
2 Dec-21 2 2 2 0 0 0
3 Nov-21 3 3 3 0 0 0
4 Oct-21 4 4 4 0 0 0
5 Jan-22 1 5 5 -4 -4 0
6 Dec-21 2 6 6 -4 -4 0
7 Nov-21 3 7 7 -4 -4 0
8 Oct-21 4 8 8 -4 -4 0
9 Jan-22 1 1 9 0 -8 -8
10 Dec-21 2 2 10 0 -8 -8
11 Nov-21 3 3 11 0 -8 -8
12 Oct-21 4 4 12 0 -8 -8
13 Jan-22 1 5 13 -4 -12 -8
14 Dec-21 2 6 14 -4 -12 -8
15 Nov-21 3 7 15 -4 -12 -8
16 Oct-21 4 8 16 -4 -12 -8
然后将该函数应用于您的列表,即
lapply(dfList, f1)
数据
structure(list(Date = c("Jan-22", "Dec-21", "Nov-21", "Oct-21",
"Jan-22", "Dec-21", "Nov-21", "Oct-21", "Jan-22", "Dec-21", "Nov-21",
"Oct-21", "Jan-22", "Dec-21", "Nov-21", "Oct-21"), City1 = c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L),
City2 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L), City3 = 1:16), class = "data.frame", row.names = c(NA,
-16L))
我很难在多个数据帧的函数中获得一个函数。
我有多个数据框:看起来都像
A <- data.frame(Date = as.character(c("Jan-22", "Dec-21", "Nov-21", "Oct-21")),
City1 = seq(1:4),
City2 = seq(1:8))
但是有些数据框有更多的城市(3 到 8 个)。我想 运行 所有数据帧的以下代码:
Dates_A <- A$Date
A$Date <- NULL
nm1 <- combn(names(A), 2, FUN = paste, collapse = "_")
A[nm1] <- combn(A, 2, FUN = function(x) abs(x[[1]]- x[[2]]))
Casava$A<- Dates_A
适用于我的第一个 Dataframe。所以我试着把我所有的数据框放到一个列表中
dfList <- list(A, B, C, D, E)
并将代码放入循环中:
for (i in 1: length(dfList))
{
Dates_i <- dfList[i]$Date
dfList[i]$Date <- NULL
nm1 <- combn(names(dfList[[i]]), 2, FUN = paste, collapse = "_")
dfList[i][nm1] <- combn(dfList[[i]], 2, FUN = function(x) abs(x[[1]]- x[[2]]))
dfList[i] <- select(dfList[[i]], contains("_"))
dfList[i]$Dates <- Dates_i}
但现在我收到错误:
x[[1]] 中的错误 - x[[2]]:二元运算符的非数字参数
有人可以帮忙吗?我对循环不熟悉。
编辑: 抱歉,我在单个 Dataframe 上更正了我 运行 的第一个代码(3 我只是因为我尝试过它 - 现在它不起作用,2 是我想要的)。
我的代码只在循环中中断
dfList[i][nm1] <- combn(dfList[[i]], 2, FUN = function(x) abs(x[[1]]- x[[2]]))
我会略有不同。我会将所有内容包装在一个函数中并应用,即
f1 <- function(df){
cbind.data.frame(df,
lapply(combn(df[-1], 2, simplify = FALSE), function(i) {
nm <- paste0(names(i[1]), '_', names(i[2]));
i[nm] <- i[1] - i[2];
i[3]}))
}
> f1(A)
Date City1 City2 City3 City1_City2 City1_City3 City2_City3
1 Jan-22 1 1 1 0 0 0
2 Dec-21 2 2 2 0 0 0
3 Nov-21 3 3 3 0 0 0
4 Oct-21 4 4 4 0 0 0
5 Jan-22 1 5 5 -4 -4 0
6 Dec-21 2 6 6 -4 -4 0
7 Nov-21 3 7 7 -4 -4 0
8 Oct-21 4 8 8 -4 -4 0
9 Jan-22 1 1 9 0 -8 -8
10 Dec-21 2 2 10 0 -8 -8
11 Nov-21 3 3 11 0 -8 -8
12 Oct-21 4 4 12 0 -8 -8
13 Jan-22 1 5 13 -4 -12 -8
14 Dec-21 2 6 14 -4 -12 -8
15 Nov-21 3 7 15 -4 -12 -8
16 Oct-21 4 8 16 -4 -12 -8
然后将该函数应用于您的列表,即
lapply(dfList, f1)
数据
structure(list(Date = c("Jan-22", "Dec-21", "Nov-21", "Oct-21",
"Jan-22", "Dec-21", "Nov-21", "Oct-21", "Jan-22", "Dec-21", "Nov-21",
"Oct-21", "Jan-22", "Dec-21", "Nov-21", "Oct-21"), City1 = c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L),
City2 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 2L, 3L, 4L,
5L, 6L, 7L, 8L), City3 = 1:16), class = "data.frame", row.names = c(NA,
-16L))