使用基于另一个数据框中的值的循环创建和填充多个列

时间:2014-07-21 21:13:44

标签: r loops dataframe

我目前有一个如下所示的数据框:

    speed <- c(61,24,3,10,18,19,12,12,7,9)
    distance <-c(58,111,92,93,84,103,83,93,88,81)
    df <- as.data.frame(cbind(speed, distance))

我想要的是根据距离值将我的速度变量分类到不同的列。例如,对于示例数据帧,我希望它看起来像这样:

    under50 <- rep(NA,10)
    under100<- c(61,3,10,18,12,12,7,9,NA,NA)
    under150 <- c(61,24,3,10,18,19,12,12,7,9)
    df2 <- as.data.frame(cbind(under50, under100, under150))

我希望它尽可能自动化,因为我有23个数据帧,每个数据帧有100多行,但我不知道从哪里开始。任何帮助将非常感谢!!

2 个答案:

答案 0 :(得分:0)

您可以使用布尔向量来选择元素,允许您通过对距离向量中的所有元素进行逻辑检查来选择速度向量中的元素。

under50 <- speed[distance<50]

这可以扩展到多个距离;

cutoffs <- c(50,100,150)
under <- matrix(nrow=length(distance),ncol=length(cutoffs))
for (cutoff in 1:length(cutoffs)){
  under[,cutoff] <- speed[distance<cutoffs[cutoff]]
}

您可以再次扩展到多个data.frames。我还没有真正测试过上面的循环,如果你有很多(大)data.frames循环可能会变慢。

答案 1 :(得分:0)

所以这是另一种方式:

breaks=c(50,100,150)
result <- data.frame(sapply(breaks,function(x)with(df,ifelse(distance<x,speed,NA))))
result <- sapply(result,function(x)c(na.omit(x),rep(NA,sum(is.na(x)))))
colnames(result) <- paste0("under",breaks)
result
#       under50 under100 under150
#  [1,]      NA       61       61
#  [2,]      NA        3       24
#  [3,]      NA       10        3
#  [4,]      NA       18       10
#  [5,]      NA       12       18
#  [6,]      NA       12       19
#  [7,]      NA        7       12
#  [8,]      NA        9       12
#  [9,]      NA       NA        7
# [10,]      NA       NA        9

该行:

result <- data.frame(sapply(breaks,function(x)with(df,ifelse(distance<x,speed,NA))))

利用ifelse(...)函数ro return speedNA,具体取决于distance的值。这一行:

result <- sapply(result,function(x)c(na.omit(x),rep(NA,sum(is.na(x)))))

将NA移动到最后。