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

5
我需要在R数据框中循环因子水平。在循环内部,我需要对包含这些水平对定义的子集的数据框执行操作。这些对是该因子的两个连续唯一水平。
以下是我尝试过的示例:
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"))

1
你想要什么样的输出?你能分享一下吗? - www
2个回答

6
问题在于,您循环遍历了fac的所有级别,而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()来打印结果,但你可能想要将其存储在其他地方(例如列表中)。


1
一种不需要循环的解决方案。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接