learner01
learner01

Reputation: 23

how to apply function to each column in dataframe of R

I want to apply a function to each column in R. Suppose following is the dataframe with (3xn):

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

if we want to check if the first 2 elements suppose (e1==1, e2==2) for each column (h1,h2...). How could we apply the checking function to each column in the data frame?

Upvotes: 2

Views: 3540

Answers (3)

alex_jwb90
alex_jwb90

Reputation: 1723

You can try this (extensible to check more than two rows if you remove the & 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)
  )

If you don't want to create new columns <col>_equals_rownum but replace h1,h2,...-columns, just remove the name in the list-call.

Upvotes: 0

r2evans
r2evans

Reputation: 160792

Using @alex_jwb90's data,

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 

Upvotes: 3

akrun
akrun

Reputation: 887831

Subset the rows of the data based on either row.names or the head, compare == with a vector of values, get the colSums of the logical matrix derived from it and check if that is equal to 2 i.e. if both the elements are TRUE for each column

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

Or with apply, loop over the columns (MARGIN = 2), apply the function (anonymous function call) and check if all are TRUE from the comparison

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

Upvotes: 3

Related Questions