R - условные метки во фреймах данных, основанные на значениях индекса, без циклов - PullRequest
0 голосов
/ 08 сентября 2018

R вопрос! Я пытаюсь пометить строки в кадре данных на основе их индексов. Например, я хочу пометить все строки с индексом = x и

У меня огромный фрейм данных с тысячами строк, поэтому я стараюсь избегать большого количества циклов ... Я создал столбец значений индекса в моем фрейме данных и хочу сравнить эти значения с вектором значений для того, чтобы стратегически пометить строки в моем фрейме данных. Это структура, которую я хочу избежать (я попробовал это, и это работает, это просто навсегда):

for (i in 1:nrow(dataframe)){
  for (j in 1:length(index_values)){
    if (dataframe$Index[i]>index_values[j] & dataframe$Index[i]<index_values[j+1]{
      dataframe$Label[i]='blah'
    }
  }
}

Я пытался использовать "ifelse", но он не работает в цикле? Это то, что я пробовал, но поле «Метка» не было заполнено ничем.

for (i in 1:length(index_values)){
dataframe$Label <- ifelse((dataframe$Index>index_value[i] & dataframe$Index<index_value[i+1]),'blah',0) 
}

Есть ли у кого-нибудь предложения о том, как заставить "ifelse" работать в этом контексте, или какие-либо другие более эффективные способы подойти к этому? Спасибо !!

This is the result of dput(head(dataframe, 20))... the column I want to populate is the one called "PEPMASSLabel", you can ignore the one that says "Label2":

structure(list(Data = c("BEGIN IONS", "PEPMASS=81.52200", 
"MSLEVEL=1", "CHARGE=1+", "100.1120 4121.67 ", "101.0592 3174.14 ", 
"          102.1273 13152.36 ", "          103.9552 3842.30 ", 
"          104.1066 4018.44 ", "          111.0437 3431.08 ", 
"          113.9635 4037.19 ", "          114.0912 7486.78 ", 
"          116.0708 4411.26 ", "          117.0541 3008.86 ", 
"          118.0862 37381.12 ", "          118.1225 8411.46 ", 
"          124.0241 12898.76 ", "          127.0385 6135.08 ", 
"          128.9509 5558.22 ", "          129.0407 8047.48 "), 
    PEPMASSLabel = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Index = 1:20, PEPMASSLabel2 = 
c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = 
c("Data", "PEPMASSLabel", "Index", "PEPMASSLabel2"), row.names = c(NA, 
20L), class = "data.frame")

Я хочу, чтобы столбец "Метка" был заполнен различными текстовыми строками.

1 Ответ

0 голосов
/ 09 сентября 2018

dplyr :: case_when также может быть применено здесь, хотя и не так кратко, как cut.

# define these for each file
breaks <- c(2, 3, 7, 10, 15)

Data <- Data %>%
  mutate(Label = case_when(Index < breaks[1] ~ "A",
                           Index < breaks[2] ~ "B",
                           Index < breaks[3] ~ "C",
                           Index < breaks[4] ~ "D",
                           Index < breaks[5] ~ "E",
                           TRUE ~ "Z"))


> head(Data)
               Data PEPMASSLabel Index PEPMASSLabel2 Label
1        BEGIN IONS            0     1             0     A
2  PEPMASS=81.52200            0     2             0     B
3         MSLEVEL=1            0     3             0     C
4         CHARGE=1+            0     4             0     C
5 100.1120 4121.67             0     5             0     C
6 101.0592 3174.14             0     6             0     C
...