xxxRxxx
xxxRxxx

Reputation: 367

Can't match character value to multiple columns

I'm trying to match a character value, "C", to multiple columns in a dataframe. Here's part of the frame:

X1 X2

1  F  F
2  C  C
3  D  D
4 A# A#

Here's what happens when I try to match the value "C":

> "C" %in% frame[, 1]
[1] TRUE
> "C" %in% frame[, 1:2]
[1] FALSE

Considering that "C" is in both columns, I can't figure out why it's returning false. Is there a function or operator that can test to see if a value is present in multiple columns? My goal is to create a function that can sum the number of times a character value like "C" is found in specified columns.

Upvotes: 1

Views: 36

Answers (2)

Ernest A
Ernest A

Reputation: 7839

You probably want to use grepl here, which returns a logical vector. Then you can count the number of occurrences with sum.

> frame
   X1 X2
 1  F  F
 2  C  C
 3  D  D
 4 A# A#
> grepl('C', frame$X1)
 [1] FALSE  TRUE FALSE FALSE
> sum(grepl('C', frame$X1))
 [1] 1

and to count the total number of Cs in every column you can use lapply (note: apply is better suited for matrices, not data frames which are lists.)

> sum(unlist(lapply(frame, function(col) grepl('C', col))))
 [1] 2

Upvotes: 0

Colonel Beauvel
Colonel Beauvel

Reputation: 31161

Try:

apply(frame, 2, function(u) "C" %in% u)

You can also use is.element:

apply(frame, 2, function(u) is.element("C",u))

Upvotes: 1

Related Questions