1

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.

2 Answers 2

4

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
Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.