簡體   English   中英

在 R 中使用 `lapply` 從初始數據幀中創建 data.frames

[英]Create data.frames out of an initial dataframe using `lapply` in R

我想知道如何,如果我可以做出其他7個data.frames出的dat1使用lapply使得在每一輪從左至右每對1以s C1C2成為0除的最后兩個元件C1C2 見下面所需的輸出

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM