#r
#r
Вопрос:
Я хочу запустить цикл for над списком. У меня есть 3 вопроса:
- Интересно, как я выбираю каждый список в «i в 1: список», когда делаю то же самое для фрейма данных, для которого он может быть (i в 1: ncol (df)), но как это должно быть записано для списка?
- Мне также интересно, как я мог бы «добавить» значения для каждого цикла в «выходную» матрицу?
- Как преобразовать список во фрейм данных. При выполнении этого, как data.frame(df3), они будут добавлены по столбцам, количество строк всегда будет равно 3.
Большое спасибо, если у кого-то есть предложения!
name <- rep("gg",3)
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.001),3)
df <- data.frame(name,id, emmeans,p)
df
df <- list(df)
name <- rep("ff",3)
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.003),3)
df2 <- data.frame(name,id, emmeans,p)
df2 <- list(df2)
df3 <- list(df,df2)
df3
> df3
[[1]]
[[1]][[1]]
name id emmeans p
1 gg A 0.2248491 0.001
2 gg B 0.4213938 0.001
3 gg C 0.3671521 0.001
[[2]]
[[2]][[1]]
name id emmeans p
1 ff A 0.2561801 0.003
2 ff B 0.1705811 0.003
3 ff C 0.9714178 0.003
output <- matrix(nrow=2, ncol=5)
for(i in 1:list){ # what could be written here?
d <- as.data.frame(df3[[i]])
for(j in 1:nrow(d)){
output[i,1] <- d[1,3]
output[i,2] <- d[2,3]
output[i,3] <- d[3,3]
output[i,4] <- d[1,4]
output[i,5] <- d[1,1]
}
}
#Wanted outcome:
output
[,1] [,2] [,3] [,4] [,5]
[1,] "0.224849119782448" "0.421393777942285" "0.367152112303302" "0.001" "gg"
[2,] "0.256180095253512" "0.170581063022837" "0.971417842432857" "0.003" "ff"
Комментарии:
1.1.
length(df3)
, 2.cbind
, 3.dplyr::bind_rows(df3)
2. Но (2) ужасно неэффективно — настройте так, чтобы ваша выходная матрица имела правильный размер с самого начала, а затем замените значения по умолчанию вашими фактическими результатами в вашем цикле, вместо того, чтобы «увеличивать» вашу матрицу, увеличивая ее с каждой итерацией.
3. @Gregor Thomas спасибо за ваш ответ! У вас есть предложения о том, как это сделать?
4. Мне трудно понять, какова ваша фактическая цель. У вас есть
output <- matrix(nrow=6, ncol=2)
, так что вы уже инициализируетеoutput
некоторый размер — просто убедитесь, что size — это конечный размер, который вы хотите, чтобы он был.5. Также трудно сказать, что происходит с вашей настройкой. Например, у вас есть
df <- data.frame(name,id, q1,q2)
, какdf
и фрейм данных. Тогда вы делаетеdf <- list(df)
, так что теперьdf
это список, содержащий только фрейм данных. И затем то же самое дляdf2
. Затем, когда вы это сделаетеdf3 <- list(df, df2)
, у вас будет список, состоящий из 2 элементов, и каждый элемент представляет собой список, содержащий один фрейм данных — относительно сложную структуру данных.
Ответ №1:
Эти данные достаточно странно структурированы, а извлечение достаточно уникально, поэтому я думаю for
, что цикл — самый простой способ. Что-то вроде этого:
output <- matrix(nrow = length(df3), ncol=5)
for(i in seq_along(df3)) {
output[i, ] = with(df3[[i]], c(emmeans, p[1], name[1]))
}
output
# [,1] [,2] [,3] [,4] [,5]
# [1,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"
# [2,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"