根据R

时间:2015-08-03 14:06:07

标签: r

我有一个数据帧( df )172 * 92和一个向量( limit )。 df构造如下:

          Sample1 Sample2 Sample3   ...  Sample92
Person 1   5.8      1.2     3.3     ...     ...
Person 2   5.2      3.4     6.2     ...    
Person 3   8.3      5.0     6.3     ...
    .
Person 172 ....

矢量限制有92个元素(5.3 , 4.8 , 6.1, ...)

我现在想要将df中的值替换为1或0,具体取决于该值是否大于对应于该列的限制中的元素。这意味着第一列中大于5.3的所有元素都应该替换为1而其他元素应该替换为0.第二列应该与值4.8进行比较,依此类推。

所以我上面的df看起来像是:

          Sample1 Sample2 Sample3   ...  Sample92
Person 1   1        0       0       ...     ...
Person 2   0        0       1       ...    
Person 3   1        1       1       ...
    .
Person 172 ....

我尝试编写代码,但您可能认为它不起作用。

dfcopy<-df
for (i in 1:92){
  dfcopy[i]<-if(dfcopy[,i]>=limit[i]) 
 {1}
  else{0}  
}

2 个答案:

答案 0 :(得分:3)

您可以使用

 +(df > limit[col(df)])
 #           Sample1 Sample2 Sample3
 #Person 1       1       0       0
 #Person 2       0       0       1
 #Person 3       1       1       1

上述工作正如我们正在比较等长的元素。在这个例子中,有3列用于&#39; df&#39;限制&#39;中的3个元素。通过复制&#39;限制&#39;,我们逐个元素地进行比较。这里col(df)给出了&#39; df&#39;列的数字索引。

 col(df)
 #     [,1] [,2] [,3]
 #[1,]    1    2    3
 #[2,]    1    2    3
 #[3,]    1    2    3

根据“限制”中元素的顺序,第一次观察重复3次,第2次重复3次,依此类推......

然后我们通过>创建一个逻辑矩阵。 TRUE/FALSE可以被强制转换为二元&#39;通过添加(+0L)或乘以(*1L)或另一个紧凑选项的形式(+()。

数据

 df <- structure(list(Sample1 = c(5.8, 5.2, 8.3), Sample2 = c(1.2, 3.4, 
 5), Sample3 = c(3.3, 6.2, 6.3)), .Names = c("Sample1", "Sample2", 
 "Sample3"), class = "data.frame", row.names = c("Person 1", "Person 2", 
 "Person 3"))
limit <-  c(5.3, 4.8, 6.1)

答案 1 :(得分:0)

你可以使用你的矢量创建一个矩阵:

mat <- matrix(rep(vec, 172), ncol= 92, byrow = T)

然后你可以使用ifelse比较你的数据框和向量,并在结果中给出输出:

result_df <- ifelse(df > vec, 1, 0)