R for循环:对于列中具有相同值的所有行组,执行

时间:2016-06-01 17:19:51

标签: r for-loop nested-loops

我希望能帮助理解在R中进行某项计算所需的语法。

我有一个这样的数据框:

a b c
1 1 0
2 1 1
3 1 0
4 2 0
5 2 0
6 3 1
7 3 0
8 3 0
9 4 0

我希望创建一个值为1的新列“d”,如果(且仅当)列“c”中的任何值等于1 ,对于具有相同值的每组行在“b。”栏中否则(见第4,5和9行)列“d”给出0。

a b c d
1 1 0 1
2 1 1 1
3 1 0 1
4 2 0 0
5 2 0 0
6 3 1 1
7 3 0 1
8 3 0 1
9 4 0 0

这可以用for循环完成吗?如果是这样的话,任何关于如何撰写的建议将不胜感激。

3 个答案:

答案 0 :(得分:5)

使用data.table

setDT(df)
df[, d := as.integer(any(c == 1L)), b]

答案 1 :(得分:1)

要在基数R中执行此操作(使用与dat.table方法any相同的常规函数​​),可以使用ave

df$d <- ave(cbind(df$c), df$b, FUN=function(i) any(i)==1)

答案 2 :(得分:1)

因为你要求循环:

# adding the result col
dat <- data.frame(dat, d = rep(NA, nrow(dat)))

# iterate over group
for(i in unique(dat$b)){
  # chek if there is a one for 
  # each group
  if(any(dat$c[dat$b == i] == 1))
     dat$d[dat$b == i] <- 1
  else
    dat$d[dat$b == i] <- 0
}

当然data.table解决方案更优雅;)