我有一个数据帧( 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}
}
答案 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)