2017-07-14 6 views
1

Ich habe einen Datenrahmen von Werten, die darstellen fold Änderungen als solche zu ersetzen:Werte in Datenrahmen mit einem anderen Datenrahmen r

> 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 

Und einen Datenrahmen von pValues ​​als solche, die identisch Zeilen und Spalten übereinstimmt:

> 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 

Was ich will, ist die Werte in DF1 zu ändern, so dass nur die Werte, die einen entsprechenden pvalue in df2 < .05 hatte, beibehalten, und andernfalls durch NA ersetzen. Hinweis: In df2 gibt es auch NA.

> 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 

Ich versuchte zunächst, Vektor-Syntax auf diesem Datenrahmen zu verwenden, und das hat nicht funktioniert. Dann probierte ich eine for-Schleife nach Spalten und das scheiterte auch.

Ich glaube nicht, dass ich verstehe, wie jede i, j-Position indexiert und dann df1-Werte durch df2-Werte basierend auf einem logischen ersetzt.

Oder wenn es eine bessere Art und Weise in R.

Antwort

4

du versuchen:

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 
1

ifelse und as.matrix scheinen den Trick zu tun.

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)) 

Ergebnis

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