Для Loop, чтобы проверить, если какие-либо строки имеют специфический набор значений - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь запустить цикл for, чтобы проверить, содержат ли какие-либо мои строки определенный набор значений. Я уже знаю, что вы можете просто применить функцию для удаления набора из кадра данных, но я хочу знать, как запустить цикл for. Спасибо!

Это мой фрейм данных:

df <- as.data.frame(matrix(NA, nrow = 12, ncol = 3))
df$V1 <- c('1','1','2','3','3','3','4','4','5','5','5','5')
df$V2 <- c('CCC','BBB','AAA','AAA','EEE','BBB','AAA','DDD','EEE','EEE','BBB','CCC')
df$V3 <- c(100,90,80,85,66,98,62,74,56,85,77,66)
colnames(df) <- c('ID','Secondary_ID','Number')

Группировка данных, поэтому в строке есть только 1 уникальный идентификатор

library(dplyr)
library(tidyr)
df_2 <- df%>%
  group_by(ID)%>%
  summarise(Key_s = paste0(Secondary_ID, collapse = ','))%>%
  separate(Key_s, into = c('1','2','3','4'))

Я знаю, что вы можете удалить конкретный набор следующим образом:

remove_this <- c('BBB','CCC')

df_remove <- apply(df_2, 1, function(x) !any(x %in% remove_this))
final_dataframe <- df_2[df_remove,]

Я пытаюсь запустить цикл for, который создает другой столбец с именем output, и если он содержит определенный набор, кроме «Да», иначе «Нет».

Примерно так:

output <- as.character(nrow(df_2))

for(i in 1:nrow(df_2)){
  if(df_2[i,] %in% remove_this){
    df_2$output <- "Yes"
  }else{df_2$output <- "No"}
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вам не нужно создавать цикл for:

remove_this <- c('BBB','CCC')
df_remove <- apply(df_2, 1, function(x) !any(x %in% remove_this))

df_2 %>% 
  mutate(output = c("No", "Yes")[df_remove + 1L])
# A tibble: 5 x 6
  ID    `1`   `2`   `3`   `4`   output
  <chr> <chr> <chr> <chr> <chr> <chr> 
1 1     CCC   BBB   NA    NA    No    
2 2     AAA   NA    NA    NA    Yes   
3 3     AAA   EEE   BBB   NA    No    
4 4     AAA   DDD   NA    NA    Yes   
5 5     EEE   EEE   BBB   CCC   No

«Хитрость» заключается в преобразовании логических значений FALSE и TRUE из df_remove в целочисленные индексы, которые используются для подмножества вектора c("No", "Yes").

0 голосов
/ 07 ноября 2018

Повторите тест, чтобы увидеть, есть ли в строке содержимое remove_this.

df_2$output <- NA  # initialize the column
for(i in 1:nrow(df_2)){
    df_2$output[i] <- ifelse(all(remove_this %in% df_2[i,]), 'Yes', 'No')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...