在没有for循环的情况下操作数据帧
问题描述:
我写了一个for循环来处理一个相当大(〜1,000,000行)的数据帧,但是它运行速度太慢,我在网上找不到任何东西。在没有for循环的情况下操作数据帧
df=data.frame(v1=runif(10), v2=runif(10), v3=runif(10), v4=0, v5=0, v6=0, v7=0)
for(i in 1:dim(df)[1]) {
df[i,4]=length(which(df[i,1:3]>0.00 & df[i,1:3]<0.10))
df[i,5]=length(which(df[i,1:3]>0.10 & df[i,1:3]<0.50))
df[i,6]=length(which(df[i,1:3]>0.50 & df[i,1:3]<0.90))
df[i,7]=length(which(df[i,1:3]>0.90 & df[i,1:3]<1.00))
}
我试图写一个函数来做到这一点,但它一起将所有行:
test.fun <- function (df) {
df[,4]=length(which(df[,1:3]>0.00 & df[,1:3]<0.10))
df[,5]=length(which(df[,1:3]>0.10 & df[,1:3]<0.50))
df[,6]=length(which(df[,1:3]>0.50 & df[,1:3]<0.90))
df[,7]=length(which(df[,1:3]>0.90 & df[,1:3]<1.00))
return(df)
}
(test <- test.fun(df))
答
rowSums
与你想要的是主要的想法的条件。
您可以使用dplyr
包使它更清洁:
df %>%
mutate(v4 = rowSums(df[,1:3]>0.00 & df[,1:3]<0.10))%>%
mutate(v5 = rowSums(df[,1:3]>0.10 & df[,1:3]<0.50))%>%
mutate(v6 = rowSums(df[,1:3]>0.50 & df[,1:3]<0.90))%>%
mutate(v7 = rowSums(df[,1:3]>0.90 & df[,1:3]<1.00))
# v1 v2 v3 v4 v5 v6 v7
# 1 0.2875775 0.95683335 0.8895393 0 1 1 1
# 2 0.7883051 0.45333416 0.6928034 0 1 2 0
# 3 0.4089769 0.67757064 0.6405068 0 1 2 0
# 4 0.8830174 0.57263340 0.9942698 0 0 2 1
# 5 0.9404673 0.10292468 0.6557058 0 1 1 1
# 6 0.0455565 0.89982497 0.7085305 1 0 2 0
# 7 0.5281055 0.24608773 0.5440660 0 1 2 0
# 8 0.8924190 0.04205953 0.5941420 1 0 2 0
# 9 0.5514350 0.32792072 0.2891597 0 2 1 0
# 10 0.4566147 0.95450365 0.1471136 0 2 0 1
数据:
set.seed(123) #to make a reproducible example
df=data.frame(v1=runif(10), v2=runif(10), v3=runif(10), v4=0, v5=0, v6=0, v7=0)
这是赚不到了意义。这些的长度将是单个数字,但您分配给整个列。我建议你使用自然语言,并且确定回答什么样的表单,而不是使用失败的代码进行交流。 –
Erik,我可以在你的个人资料中看到你问了(好)问题,但没有接受任何答案。请阅读[我应该怎么做,当有人回答我的问题?](https://stackoverflow.com/help/someone-answers)和[为什么我应该这样做?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Masoud