【发布时间】:2016-02-09 16:46:15
【问题描述】:
我想设置一个条件,如果数据框中单元格的坐标是 [i,j] 其中 j=i+1,那么单元格的值应该等于 1。例如,在数据框 (df) 下面有 5 列和 4 行:
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
我尝试了以下方法:
for(i in 1:nrow(df)){
for(j in 1:ncol(df)){
if(j==i+1){
df[i,j] == 1
}}}
此代码不会更改 df 中的任何内容。我认为它不起作用的原因是因为它引用了 [i,j] 中的实际值,而不是它们在数据框中的“坐标”?
然后我尝试了:
for(i in df[nrow(df)]){
for(j in df[ncol(df)]){
if (j==i+1){
df[i,j]==1
}}}
然后得到这个:
警告信息: 如果 (j == i + 1) { : 条件的长度 > 1,并且只使用第一个元素
我会将解决方案扩展到更大的数据帧 (214x215),所以我认为循环可能是最好的方法。任何关于我的代码错误的建议/cmets 或更好的方法将不胜感激!如果有任何需要澄清的地方,请告诉我。谢谢!
【问题讨论】:
-
在 for 循环中尝试
df[i,j]=1或df[i,j] <- 1==是逻辑运算符 -
不要使用循环。改用
diag(df) <- 1,可能在子集df之后,比如diag(df[,-1]) <- 1 -
感谢@NicE - 我需要重新了解操作员!
-
另外——“诊断”正是我现在所需要的。 @RHertel - 谢谢