繁体   English   中英

如何将 function 应用于 R 的 dataframe 中的每一列

[英]how to apply function to each column in dataframe of R

我想将 function 应用于 R 中的每一列。 假设以下是具有 (3xn) 的 dataframe:

df <- data.frame(
  h1 = c(1,2,3),
  h2 = c(2,3,1),
  h3 = c(3,2,1),
  h4 = c(1,2,3),
  h5 = c(1,2,3)
)
rownames(df) <- c("e1", "e2", "e3")
df
#    h1 h2 h3 h4 h5
# e1  1  2  3  1  1
# e2  2  3  2  2  2
# e3  3  1  1  3  3

如果我们要检查前 2 个元素是否假设 (e1==1, e2==2) 用于每一列 (h1,h2...)。 我们如何将检查 function 应用于数据框中的每一列?

根据row.nameshead对数据行进行子集,将==与值向量进行比较,获取从中派生的逻辑matrixcolSums并检查是否等于 2,即两个元素是否为TRUE对于每一列

colSums(mat[c("e1", "e2"),] == c(1, 2))==2

或者使用apply ,遍历列(MARGIN = 2 ),应用 function (匿名 function 调用)并从比较中检查是否allTRUE

apply(head(mat, 2), 2, function(x) all(x  == c(1, 2)))

使用@alex_jwb90 的数据,

lapply(df, function(a) a[1:2] == 1:2)
# $h1
# [1] TRUE TRUE
# $h2
# [1] FALSE FALSE
# $h3
# [1] FALSE  TRUE
# $h4
# [1] TRUE TRUE
# $h5
# [1] TRUE TRUE

lapply(df, function(a) all(a[1:2] == 1:2))
# $h1
# [1] TRUE
# $h2
# [1] FALSE
# $h3
# [1] FALSE
# $h4
# [1] TRUE
# $h5
# [1] TRUE

sapply(df, function(a) all(a[1:2] == 1:2))
#    h1    h2    h3    h4    h5 
#  TRUE FALSE FALSE  TRUE  TRUE 

你可以试试这个(如果你删除& row_number() <= 2可以扩展检查两行以上)

library(dplyr)

df = tibble(
  h1 = c(1,2,3),
  h2 = c(2,3,1),
  h3 = c(3,2,1),
  h4 = c(1,2,3),
  h5 = c(1,2,3)
)

df %>%
  mutate_all(
    list(equals_rownum = ~.==row_number() & row_number() <= 2)
  )

如果您不想创建新列<col>_equals_rownum而是替换 h1,h2,...-columns,只需删除list -call 中的名称即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM