首页 文章

如何跨data.frame列应用函数?

提问于
浏览
3

假设我有一个数值框这样的数据框

AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta
1     0.15851770    0.44264830    0.46662180    0.79579230   0.555430100
2     0.87148450    0.93462340    0.92591830    0.93812860   0.942683400
3     0.60907060    0.92463760    0.62698660    0.86852790   0.457659300
4     0.10728340    0.07848221    0.06340047    0.08589865   0.118239800
5     0.72353630    0.91198210    0.87339600    0.88050440   0.902925300
6     0.52616050    0.57114700    0.29431990    0.56032260   0.530103800
7     0.50321330    0.78129660    0.26986880    0.77825860   0.924097500
8     0.47808630    0.11267250    0.30519660    0.36128510   0.741012600
9     0.17698960    0.11461960    0.57776080    0.37801670   0.465766500
10    0.01268375    0.01370702    0.01194124    0.01227029   0.009222724

我想使用这些条件将所有数值更改为每行中的字母

Avg beta 0-0.2变为AA,Avg beta 0.4-0.6变为AB,Avg beta 0.8-1变为BB

所以我写了类似的东西

apply(table, 2, function(x) ifelse (x>0 & x< 0.2, "AA",ifelse(x>0.4 & x<0.6,"AB",
+ "BB"))  )

但我明白了

AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta
[1,] "AA"          NA            NA            NA            NA           
[2,] "BB"          NA            NA            NA            NA           
[3,] "BB"          NA            NA            NA            NA           
[4,] "AA"          NA            NA            NA            NA           
[5,] "BB"          NA            NA            NA            NA           
[6,] "AB"          NA            NA            NA            NA           
[7,] "AB"          NA            NA            NA            NA           
[8,] "AB"          NA            NA            NA            NA           
[9,] "AA"          NA            NA            NA            NA           
[10,] "AA"          NA            NA            NA            NA

只有第一列可能我错过了与for循环相关的东西?

提前致谢

2 回答

  • 3

    使用 sapply 而不是 apply

    重新创建您的数据:

    dat <- read.table(text="
    AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta
    1     0.15851770    0.44264830    0.46662180    0.79579230   0.555430100
    2     0.87148450    0.93462340    0.92591830    0.93812860   0.942683400
    3     0.60907060    0.92463760    0.62698660    0.86852790   0.457659300
    4     0.10728340    0.07848221    0.06340047    0.08589865   0.118239800
    5     0.72353630    0.91198210    0.87339600    0.88050440   0.902925300
    6     0.52616050    0.57114700    0.29431990    0.56032260   0.530103800
    7     0.50321330    0.78129660    0.26986880    0.77825860   0.924097500
    8     0.47808630    0.11267250    0.30519660    0.36128510   0.741012600
    9     0.17698960    0.11461960    0.57776080    0.37801670   0.465766500
    10    0.01268375    0.01370702    0.01194124    0.01227029   0.009222724
    ")
    

    使用 sapply

    sapply(dat, function(x) 
          ifelse (x>0 & x< 0.2, "AA",ifelse(x>0.4 & x<0.6,"AB", "BB"))
    )
    
          AA01.AVG_Beta AA02.AVG_Beta AA03.AVG_Beta AA04.AVG_Beta AA05.AVG_Beta
     [1,] "AA"          "AB"          "AB"          "BB"          "AB"         
     [2,] "BB"          "BB"          "BB"          "BB"          "BB"         
     [3,] "BB"          "BB"          "BB"          "BB"          "AB"         
     [4,] "AA"          "AA"          "AA"          "AA"          "AA"         
     [5,] "BB"          "BB"          "BB"          "BB"          "BB"         
     [6,] "AB"          "AB"          "BB"          "AB"          "AB"         
     [7,] "AB"          "BB"          "BB"          "BB"          "BB"         
     [8,] "AB"          "AA"          "BB"          "BB"          "BB"         
     [9,] "AA"          "AA"          "AB"          "BB"          "AB"         
    [10,] "AA"          "AA"          "AA"          "AA"          "AA"
    
  • 2

    你可以使用 cut

    x <- c(0.15,0.2,0.4,0.6,0.8,1.0)
    cut(x,c(0,0.2,0.4,0.6,0.8,1.0),labels=c("AA",NA,"AB",NA,"BB"))
    [1] AA   AA   <NA> AB   <NA> BB  
    Levels: AA <NA> AB <NA> BB
    Warning message:
    In `levels<-`(`*tmp*`, value = c("AA", NA, "AB", NA, "BB")) :
      duplicated levels will not be allowed in factors anymore
    

    请注意警告,因为我在分区中使用了NA .

相关问题