在 R 中循环因子水平 - 如何操作两个连续的水平



我需要遍历R data.frame中的因子水平。在循环中,我需要对 data.frame 进行操作,这些帧包含由这些级别的对定义的子集。这些货币对是该因子的两个连续唯一水平。

这是我尝试过的示例:

require(dplyr)
df <- data.frame(fac = rep(c("A", "B", "C"), 3))
for(i in levels(fac)){
   if(i != levels(fac)[length(levels(fac))]){
      df %>% filter(fac %in% c(i, i + 1))
   }
}

我尝试包含级别 i 及其后续级别,但显然表达i + 1不起作用。如何解决这个问题?我是否必须将变量fac数字,或者是否有更简洁的解决方案?

编辑:输出(对于此示例(应该是这两个数据帧:

dfAB <- df %>% filter(fac %in% c("A", "B"))
dfBC <- df %>% filter(fac %in% c("B", "C"))

问题是,你遍历了 fac 的所有级别,这是一个字符向量,因此R不能将 1 加到 i 中。

以下作品:

library(dplyr)
df <- data.frame(fac = rep(c("A", "B", "C"), 3))
df <- df %>% 
  mutate(fac = factor(fac, levels = c("A", "B", "C")))
for(i in seq_along(levels(df$fac))){
  if(i != length(levels(df$fac))){
    df %>% filter(fac %in% c(levels(fac)[i], levels(fac)[i+1])) %>% print()
  }
}
#   fac
# 1   A
# 2   B
# 3   A
# 4   B
# 5   A
# 6   B
#   fac
# 1   B
# 2   C
# 3   B
# 4   C
# 5   B
# 6   C

fac列必须是factor(否则筛选不起作用(。我在循环中添加了print()来打印结果,但您可能希望将其存储在某个地方(例如在列表中(。

没有循环的解决方案。

library(dplyr)
# Create example data frame
df <- data.frame(fac = rep(c("A", "B", "C"), 3),
                       stringsAsFactors = TRUE)
# Create all the combinations of factor
m <- combn(unique(df$fac), m = 2)
# Check the difference between factor level, only keep those differ by 1
# Create a data frame with the right combination
re <- which(as.numeric(m[2, ]) - as.numeric(m[1, ]) != 1)
m2 <- as.data.frame.matrix(m[, -re])
# Filter df by m2
df_final <- lapply(m2, function(col){
  df %>% filter(fac %in% col)
})
df_final
# $V1
#   fac
# 1   A
# 2   B
# 3   A
# 4   B
# 5   A
# 6   B
# 
# $V2
#   fac
# 1   B
# 2   C
# 3   B
# 4   C
# 5   B
# 6   C

最新更新