【问题标题】:How to apply a function across columns of data.frame?如何跨 data.frame 列应用函数?
【发布时间】:2018-06-16 18:45:34
【问题描述】:

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

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

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

平均 beta 0-0.2 更改为 AA, 平均 beta 0.4-0.6 更改为 AB, 平均 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 循环相关的东西?

提前致谢

【问题讨论】:

  • 您需要使用lapplysapply 而不是apply
  • 您还应该使用cut - 您的嵌套 ifelse 函数很可能是错误的。

标签: r


【解决方案1】:

你可以使用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。

【讨论】:

  • 不是我真正想要的,我需要与我自己的函数所做的相同的更改,但应用于所有列,谢谢
  • 正如@Andrie 所说,使用sapply
【解决方案2】:

使用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"       

【讨论】:

  • @TylerRinker textConnection 直到最近我们都是这样做的。 text=...read.table 的参数是 R2.14.0 中的一个新特性
  • 离题但我喜欢你用 read.table(text="") 读入数据。我一直在使用:ascii&lt;- function(x, header=TRUE,...){ name &lt;-textConnection(x) DF &lt;- read.table(name, header, ...) close(name) on.exit(closeAllConnections()) DF }
  • 嗨!这很好,但是有没有办法返回数据框?我的意思是,新表允许类matrix。我想有一个data.frame 不使用as.data.frame
猜你喜欢
  • 2015-01-18
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2021-06-15
  • 2021-07-13
  • 1970-01-01
  • 2015-02-23
相关资源
最近更新 更多