如何将函数应用于R数据框中的列并将输出存储在一个数据框中

时间:2016-12-08 16:50:02

标签: r loops dataframe apply

我有一个像这样的数据框

set.seed(12)
df=data.frame(a=runif(20,-100,100),b=rep(c("a","b"),10))

现在我需要弄清楚列' a'中的值百分比具有绝对值< n,n是变量:10,20,30,40,50,并将结果输出到这样的数据框中

n              10 20 30 40 50
% in the range 12% 14% 27% 40% 50%

3 个答案:

答案 0 :(得分:2)

列表结果:

n <- seq(10,50, by = 10)
list <- lapply(n, function(x) percent(sum(abs(df$a) < x)/nrow(df)))
setNames(list, n)

表示数据框:

df <- do.call(rbind, list)

答案 1 :(得分:1)

这是一种返回数据框的方法

# get a named vector of values
myValues <- setNames(seq(10, 50, 10), seq(10, 50, 10))
# return result
data.frame(lapply(myValues, function(x) sum(abs(df$a) < x) / nrow(df)))
X10  X20  X30 X40 X50
1 0.1 0.15 0.35 0.4 0.5

返回具有相同信息的命名向量甚至更简单。

myPropVec <-sapply(myValues, function(x) sum(abs(df$a) < x) / nrow(df))
myPropVec
  10   20   30   40   50 
0.10 0.15 0.35 0.40 0.50

将命名向量绘制为条形图是很简单的:

barplot(myPropVec)

enter image description here

或使用dotchart

dotchart(myPropVec)

答案 2 :(得分:1)

这样的东西可以为你提供矢量输出

n<-seq(10,50,10)

perc<-vector()

for(i in 1:5) {perc[i]<-sum(abs(df$a)<n[i])/length(df$a)}

perc
[1] 0.10 0.15 0.35 0.40 0.50