如何跨data.frame的列应用函数?
假设我有一个数据框,上面有这样的数值如何跨data.frame的列应用函数?,r,R,假设我有一个数据框,上面有这样的数值 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.6090706
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
我想使用这些条件将每行中的所有数值更改为字母
平均β0-0.2改为AA,
平均β0.4-0.6改为AB,
平均β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")) )
只有第一列
也许我遗漏了一些与for循环相关的内容
提前感谢您可以使用
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
x使用sapply
而不是apply
:
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"
重新创建数据:
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
")
你需要使用lappy
或sapply
而不是apply
你还应该使用cut
-你的嵌套ifelse函数很可能是错误的。这不是我真正想要的,我需要与我自己的函数相同的更改,但适用于所有列,thanksAs@Andrie说,直到最近,使用sapply
@tylerlinkertextConnection
是我们所有人都这么做的方式。参数text=…
到read.table
是R2.14.0Off-topic中的一项新功能,但我喜欢您使用read.table(text=”“)读入数据。我一直在使用:ascihi!这很好,但是有没有方法返回数据帧?我的意思是,新表允许类矩阵
。我想要一个data.frame
而不使用as.data.frame
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"