【问题标题】:Applying a function to each row to check against another vector将函数应用于每一行以检查另一个向量
【发布时间】:2018-04-18 23:52:47
【问题描述】:

我有一个数字向量

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(或每一行),在 x1 到 x5 列中 my.vecoccur 的百分比。我设法做到了。

apply(df[,2:6],1,function(x) x %in% my.vec)

如果列中的元素出现在 my.vec 中,这会给我 TRUE 或 FALSE。我只需要找到某种方式将其表示为百分比

【问题讨论】:

  • my.vec 的百分比或每行的百分比?
  • 另外,在创建df 之前执行set.seed 可能会很好,这样答案都可以使用相同的源数据。

标签: r dplyr subset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一种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
    

    【讨论】:

    • 基本 R 函数方法中的逻辑几乎相同 - Reduce(`+`, lapply(df[-1], `%in%`, my.vec) ) / length(my.vec)
    • 有什么办法可以用更通用的东西替换 5(即列数),因为我打算将它用于其他 x 列数不同的数据框
    • 如果它是一致的布局(ID,然后是所有列右侧的列)然后将 5 替换为 length(df) (同样对于接受的答案将 2:6 更改为... @ 987654327@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多