我想设置一个条件,如果数据帧中单元格的坐标是[i,j],其中j = i + 1,那么单元格的值应该等于1.例如,在dataframe(df)下面有5列4行:
params
它应该看起来像:
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0
D 0 0 0 0
我尝试了以下内容:
A 1 0 0 0
B 0 1 0 0
C 0 0 1 0
D 0 0 0 1
此代码不会更改df中的任何内容。我认为它不起作用的原因是因为它引用了[i,j]中的实际值而不是它们在数据帧中的“坐标”?
然后我尝试了:
for(i in 1:nrow(df)){
for(j in 1:ncol(df)){
if(j==i+1){
df[i,j] == 1
}}}
得到这个:
警告讯息: 在if(j == i + 1){: 条件的长度> 1,只使用第一个元素
我将把解决方案扩展到更大的数据帧(214x215),所以我认为循环可能是最好的方法。任何有关我的代码中的错误的建议/意见或更好的方法,将非常感谢!如果有任何需要澄清,请告诉我。谢谢!
答案 0 :(得分:0)
以下是两种不使用循环进行分配的方法。两者都使用逻辑索引并假设数据帧名为dat
(这是首选,因为df
是函数名称,F分布的密度函数):
dat[ cbind(1:4, 1+1:4) ] <- 1 # or use `nrow` and `length` as the second args to ":"
dat[ row(dat) == col(dat) -1] <- 1
数据框和矩阵都有一个col
和row
函数,可以返回索引&#34;到位&#34;:
> col(dat)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 2 3 4 5
[3,] 1 2 3 4 5
[4,] 1 2 3 4 5