我希望能帮助理解在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循环完成吗?如果是这样的话,任何关于如何撰写的建议将不胜感激。
答案 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解决方案更优雅;)