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

时间:2018-01-26 10:57:37

标签: r loops dataframe dplyr

我需要循环R data.frame中的因子级别。在循环内部,我需要对包含由这些级别对定义的子集的data.frames进行操作。这两对是该因子的两个连续唯一级别。

这是我尝试过的一个例子:

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数字或是否有更简洁的解决方案?

编辑:输出(对于此示例)应该是这两个data.frames:

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

2 个答案:

答案 0 :(得分:3)

问题是,你遍历所有级别的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 :(得分:1)

没有循环的解决方案。

FMOD_SYSTEM* sound;
FMOD_SOUND* son;
FMOD_System_Create(&sound);
FMOD_System_Init(sound, 32, FMOD_INIT_NORMAL, NULL);
FMOD_System_CreateSound(sound, "alarm.mp3", FMOD_CREATESAMPLE, 0, &son);    
SYSTEMTIME time;
GetSystemTime(&time);

while (!(time.wHour==16 && time.wDayOfWeek==4)) {
    Sleep(10000);
    GetSystemTime(&time);
}

    FMOD_System_PlaySound(sound, son, NULL, 0, NULL);
            for (int i = 0; i < 100; i++) {
                INPUT ip = { 0 };
                ip.type = INPUT_KEYBOARD;
                ip.ki.wVk = VK_VOLUME_UP;
                SendInput(1, &ip, sizeof(INPUT));
                ip.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &ip, sizeof(INPUT));
            }