akaDrHouse
akaDrHouse

Reputation: 2240

replacing values in dataframe with another dataframe r

I have a dataframe of values that represent fold changes as such:

> df1 <- data.frame(A=c(1.74,-1.3,3.1), B=c(1.5,.9,.71), C=c(1.1,3.01,1.4))
      A    B    C
1  1.74 1.50 1.10
2 -1.30 0.90 3.01
3  3.10 0.71 1.40

And a dataframe of pvalues as such that matches rows and columns identically:

> df2 <- data.frame(A=c(.02,.01,.8), B=c(NA,.01,.06), C=c(.01,.01,.03))
     A    B    C
1 0.02   NA 0.01
2 0.01 0.01 0.01
3 0.80 0.06 0.03

What I want is to modify the values in df1 so that only retain the values that had a correponding pvalue in df2 < .05, and replace with NA otherwise. Note there are also NA in df2.

> desired <- data.frame(A=c(1.74,-1.3,NA), B=c(NA,.9,NA), C=c(1.1,3.01,1.4))
> desired
      A   B    C
1  1.74  NA 1.10
2 -1.30 0.9 3.01
3    NA  NA 1.40

I first tried to use vector syntax on these dataframes and that didn't work. Then I tried a for loop by columns and that also failed.

I don't think i understand how to index each i,j position and then replace df1 values with df2 values based on a logical.

Or if there is a better way in R.

Upvotes: 1

Views: 445

Answers (2)

Damian
Damian

Reputation: 1433

ifelse and as.matrix seem to do the trick.

df1 <- data.frame(A=c(1.74,-1.3,3.1), B=c(1.5,.9,.71), C=c(1.1,3.01,1.4))
df2 <- data.frame(A=c(.02,.01,.8), B=c(NA,.01,.06), C=c(.01,.01,.03))

x1 <- as.matrix(df1)
x2 <- as.matrix(df2)

as.data.frame( ifelse( x2 >= 0.05 | is.na(x2), NA, x1) ) 

Result

      A   B    C
1  1.74  NA 1.10
2 -1.30 0.9 3.01
3    NA  NA 1.40

Upvotes: 1

LyzandeR
LyzandeR

Reputation: 37879

You can try this:

df1[!df2 < 0.05 | is.na(df2)] <- NA 

Out:

> df1
      A   B    C
1  1.74  NA 1.10
2 -1.30 0.9 3.01
3    NA  NA 1.40

Upvotes: 4

Related Questions