首页 > 解决方案 > R - 基于索引值的数据帧中的条件标签,没有循环

问题描述

问题!我正在尝试根据索引在数据框中标记行。例如,我想用索引< x“A”标记所有行,索引> = x和< y“B”的所有行等。这些索引值不是恒定的,但会因文件而异我正在处理。

我有一个包含数千行的巨大数据框,所以我试图避免很多循环......我在我的数据框中创建了一列索引值,我想将这些值与值向量进行比较,以便在我的数据框中战略性地标记行。这是我想避免的结构(我试过了,它有效,它只需要永远):

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")

我希望“标签”列由不同的文本字符串填充。

标签: rloopsif-statementconditional

解决方案


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

推荐阅读