![](/img/trans.png)
[英]Using lapply in R to loop through a list of data.frames in R
[英]Create data.frames out of an initial dataframe using `lapply` in R
我想知道如何,如果我可以做出其他7個data.frames出的dat1
使用lapply
使得在每一輪從左至右每對1
以s C1
和C2
成為0
除的最后兩個元件C1
和C2
? (見下面所需的輸出)
dat1 <- data.frame(C1 = c(1, 1, 1, 1, 1, 1, 1, 1, 0, 0),
C2 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))
dat2 <- data.frame(C1 = c(0, 1, 1, 1, 1, 1, 1, 1, 0, 0),
C2 = c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1))
dat3 <- data.frame(C1 = c(0, 0, 1, 1, 1, 1, 1, 1, 0, 0),
C2 = c(0, 0, 1, 1, 1, 1, 1, 1, 1, 1))
dat4 <- data.frame(C1 = c(0, 0, 0, 1, 1, 1, 1, 1, 0, 0),
C2 = c(0, 0, 0, 1, 1, 1, 1, 1, 1, 1))
.
.
.
dat8 <- data.frame(C1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), # the last desired data.frame
C2 = c(0, 0, 0, 0, 0, 0, 0, 0, 1, 1))
我們可以使用lapply
通過循環對數字的序列( 1:7
),創建一個兩列的matrix
與對應的rep
行licate和rbind
與原始數據的具有相同數量的行的子集去除的頂部
lst1 <- lapply(1:7, function(i) rbind(matrix(rep(c(0, 0), i), ncol = 2,
dimnames = list(NULL, c("C1", "C2"))), dat1[-seq_len(i), ]))
names(lst1) <- paste0("dat", seq_along(lst1) + 1)
可以使用cbind
縮短它
lapply(1:7, function(i) {n <- rep(0, i)
rbind(cbind(C1 = n, C2 = n), dat1[-seq_len(i), ])})
或者也可以(靈感來自@Markus 評論)
lapply(0:8, function(i) dat1 * rep(c(0, 1), c(i, nrow(dat1)-i)))
如果它需要是單獨的對象,請使用list2env
(雖然不推薦)
list2env(lst1, .GlobalEnv)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.