从dataframe为条件创建矢量for循环

时间:2016-11-07 14:53:57

标签: r for-loop vector dataframe

我有一个数据帧,类似于下面的示例,但更大(15000行):

df.example <-structure(list(Date = structure(c(3287, 3386, 4286, 5286, 6286), class = "Date"),v1 = c(1L, 1L, 1L, 1L, 1L), v2 = c(0.60378, 12.82581, 3.55357, 4.96079, 0.0422),perc = c(0.598, 0.598, 0.609, 1, 0.609), v3 = c(-99, -99, 5.83509031198686, 4.96079,0.0692939244663383)), .Names = c("Date", "v1", "v2", "perc", "v3"), row.names = c(1L, 100L, 1000L, 2000L, 3000L), class = "data.frame")

df.example:

       Date     v1       v2  perc           v3
1    1979-01-01  1  0.60378 0.598 -99.00000000
100  1979-04-10  1 12.82581 0.598 -99.00000000
1000 1981-09-26  1  3.55357 0.609   5.83509031
2000 1984-06-22  1  4.96079 1.000   4.96079000
3000 1987-03-19  1  0.04220 0.609   0.06929392

我想要做的是计算列“ perc ”的行的百分比低于“特定阈值”。我想对多个“特定阈值”多次执行此操作,如下所示:

### "certain threshold values":
seq(from =0, to = 1, by = 0.1)


### formula to be repeated/iterated/looped: (the i stands for "certain value")
100*sum(df.example$perc<=i)/nrow(df.example)

我希望结果是一个名为“ vector1 ”的向量,如下例所示:

vector1 <- c(0,0,0,0,0,0,0.2,0.6,0.6,0.6,1.0)    

这是我到目前为止所做的,但它不起作用:

### create vector to store calculated values in
vector1=c()
vector1[1]=3

### loop calculation of percentage of rows that are below "certain threshold value" in column df.example$perc
for(i in seq(0,1, by=0.1)){
vector1[i]=sum(df.example$perc<=i)/nrow(df.example)
}

我只得到一个值,我希望它是我的 vector1 中的最后一个。

我已经在SO中查看了类似的主题 R create a vector with loop structure &安培; How to make a vector using a for loop

有什么建议吗?

顺便说一下: 如果我使用的dput()没有创建要使用的数据,请注释,这是我第一次使用dput()。

3 个答案:

答案 0 :(得分:1)

关于行数,不需要每次计算它,您可以将其分配给变量。然后,您可以使用sapply

nrow_df <- nrow(df.example)
sapply(seq(from =0, to = 1, by = 0.1), function(x) sum(df.example$perc<=x)/nrow_df)
# [1] 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.8 0.8 0.8 1.0

或(矢量化)

indx <- seq(0, 1, by=0.1)
rowSums(df.example$perc <= matrix(indx, length(indx), nrow(df.example))) / nrow(df.example)
## [1] 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.8 0.8 0.8 1.0

答案 1 :(得分:0)

我们需要初始化vector1并循环遍历for循环中的序列。

s1 <- seq(0, 1, 0.1)
vector1 <- numeric(nrow(df.example))
for(i in seq_along(s1)){
   vector1[i]=sum(df.example$perc<=s1[i])/nrow(df.example)
 }
vector1
#[1] 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.8 0.8 0.8 1.0

或矢量化方法

rowSums(outer(s1, df.example$perc, FUN = `>=`))/nrow(df.example)
#[1] 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.8 0.8 0.8 1.0

答案 2 :(得分:0)

以下是使用outercolSums的第四种方法:

colSums(outer(df.example$perc, seq(from=0, to=1, by=0.1), "<=")) / nrow(df.example)
[1] 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.8 0.8 0.8 1.0

outer创建一个逻辑矩阵,显示每个阈值元素对的阈值测试。 &#34;成功&#34;使用colSums在列中求和,并将此计数除以测试的元素数。