将函数应用于每一行以检查另一个向量

时间:2018-04-18 23:52:47

标签: r dplyr subset

我有一个数字向量

my.vec <- c(244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258)

我有数据框

set.seed(123)
df <- data.frame(loc.id = rep(1:10), x1 = sample(190:285,10, replace = T), x2 = sample(200:350,10, replace = T), x3= sample(100:280,10, replace = T), x4= sample(250:350,10, replace = T), x5 = sample(150:300,10, replace = T))

我想在df中创建另一个列,其中显示每个loc.id(或每行),列{x}到x5中出现my.vec的百分比。我设法做到了这一点。

apply(df[,2:6],1,function(x) x %in% my.vec)
如果列中的元素出现在my.vec中,则

这会给我TRUE或FALSE。我只需要找到一些方法将其表示为百分比

2 个答案:

答案 0 :(得分:2)

将其包裹在ColMeans中并乘以100:

df$new_col = colMeans(apply(df[,2:6],1,function(x) x %in% my.vec)) * 100

答案 1 :(得分:1)

这是一种dplyr方法,用于在my.vec中获取行的比例值:

df %>% mutate(
  prop.my.vec = df %>% 
    select(starts_with("x")) %>% 
    mutate_all(funs(. %in% my.vec)) %>% 
    rowSums() / 5
  )

#    loc.id  x1  x2  x3  x4  x5 prop.my.vec
# 1       1 225 332 226 292 215         0.0
# 2       2 194 306 273 282 216         0.0
# 3       3 258 310 138 269 264         0.2
# 4       4 253 340 219 266 200         0.2
# 5       5 213 268 267 302 209         0.0
# 6       6 218 289 244 342 185         0.2
# 7       7 246 323 112 270 160         0.2
# 8       8 222 233 170 332 287         0.0
# 9       9 249 262 173 252 266         0.4
# 10     10 242 205 219 343 166         0.0