【问题标题】:replace in data.frame by matrix用矩阵替换data.frame
【发布时间】:2011-03-11 09:38:31
【问题描述】:

我在网上找不到这个问题的解决方案,虽然看起来很简单。这是它: 我有一个像这样命名为 df1 的数据框:

                   PIM       WDR       MYC       OBX                           
ILMN_1651282  0.555764  0.675233 0.5908629 0.4897703                           
ILMN_1651354 0.6963458 0.8588675 0.9216328   0.88705                           
ILMN_1651358 0.7501548 0.6766059 0.8157319 0.9373666                           
ILMN_1652716 0.5505098 0.5802357 0.7342341 0.5953167                           
ILMN_1654324 0.9294231 0.9311051 0.8424824  0.888825                           
ILMN_1654639 0.9197155 0.4687101  0.678938 0.4309232                           
ILMN_1655418  0.690068 0.6345875 0.9595042 0.6132203

这样的数据帧文件命名为 df2:

            PIM WDR MYC OBX                                               
ILMN_1651282  -1  -1  -1  -1                                               
ILMN_1651354  -1   1   1   1                                               
ILMN_1651358   1   1   1   1                                               
ILMN_1652716  -1  -1  -1  -1                                               
ILMN_1654324  -1  -1  -1  -1                                               
ILMN_1654639  -1  -1  -1  -1                                               
ILMN_1655418   1   1  -1   1 

我的截止值为 0.8。在 df1 中,每个高于 0.8 的值都变为 0。所有低于 0.8 的值都必须替换为 df2 (1 & -1) 中的值

创建 df2:

PIMvsEV<-list()
for (x in 1:nrow(df1)) {
t<-(if (mean(PIM[,x]) > mean(EV[,x])) {print(1)} else
if (mean(PIM[,x]) < mean(EV[,x])) {print(-1)} )
PIMvsEV[[x]]<-matrix(t)
}

WDRvsEV<-list()
for (x in 1:nrow(df1)) {
t<-(if (mean(WDR[,x]) > mean(EV[,x])) {print(1)} else
if (mean(WDR[,x]) < mean(EV[,x])) {print(-1)} )
WDRvsEV[[x]]<-matrix(t)
}

OBXvsEV<-list()
for (x in 1:nrow(cdf1)) {
t<-(if (mean(OBX[,x]) > mean(EV[,x])) {print(1)} else
if (mean(OBX[,x]) < mean(EV[,x])) {print(-1)} )
OBXvsEV[[x]]<-matrix(t)
}

MYCvsEV<-list()
for (x in 1:nrow(df1)) {
t<-(if (mean(MYC[,x]) > mean(EV[,x])) {print(1)} else
if (mean(MYC[,x]) < mean(EV[,x])) {print(-1)} )
MYCvsEV[[x]]<-matrix(t)
}

dataframe<-as.data.frame(cbind(as.matrix(PIMvsEV), as.matrix(WDRvsEV)))
dataframe<-as.data.frame(cbind(as.matrix(dataframe), as.matrix(MYCvsEV)))
dataframe<-as.data.frame(cbind(as.matrix(dataframe), as.matrix(OBXvsEV)))
row.names(dataframe)<-colnames(ttest)
colnames(dataframe)<-c("PIM","WDR","MYC","OBX")

有什么想法吗?提前非常感谢,

丽桑

【问题讨论】:

  • 你试过使用apply函数吗? nsaunders.wordpress.com/2010/08/20/…
  • 只是一个小问题,你是如何得出 df2 的?
  • 我是否可以假设您在 df1 中的数据的行数与列数一样多?什么是电动汽车?
  • 是的! EV 是空向量。这是一个转染实验

标签: r dataframe


【解决方案1】:

示例数据:

df1 <- as.data.frame(matrix(rnorm(100),10,10))
df2 <- as.data.frame(matrix(sample(c(-1,1),100,T),10,10))

data.frames 的代码

res <- df1 
res[df1>0.8] <- 0
res[df1<=0.8] <- df2[df1<=0.8] 

【讨论】:

    【解决方案2】:

    这应该做你想做的吧?

    一些数据:

    df1 <- as.data.frame(matrix(rnorm(100),10,10))
    df2 <- matrix(sample(c(-1,1),100,T),10,10)
    

    ifelse 的矢量化使用:

     ifelse( as.matrix(df1) > 0.8, 0, df2)
    
          V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
     [1,]  0  0  1 -1  1  1 -1 -1  1  -1
     [2,] -1  1  1 -1 -1 -1 -1 -1  1  -1
     [3,] -1 -1 -1  0  0 -1  1  0  1  -1
     [4,]  0 -1 -1  1 -1  1 -1  1  1   1
     [5,] -1 -1 -1 -1  0  1 -1  1  0   0
     [6,] -1  1  1  1 -1  1  0  0  1   1
     [7,] -1  1  1  0 -1 -1 -1 -1 -1  -1
     [8,]  1  1  1  0 -1 -1  1 -1  0  -1
     [9,]  1  0  0  1  1  0 -1 -1  0  -1
    [10,] -1 -1 -1 -1  1 -1 -1 -1 -1   1
    

    或者我们可以这样做

     (df1<= 0.8)*df2
    

    【讨论】:

    • 非常感谢您的解决方案!这就是我一整天都在寻找的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多