【问题标题】:How to reference the value of another cell as a condition in a for loop? (R)如何在 for 循环中引用另一个单元格的值作为条件? (右)
【发布时间】: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]=1df[i,j] <- 1 == 是逻辑运算符
  • 不要使用循环。改用diag(df) <- 1,可能在子集df之后,比如diag(df[,-1]) <- 1
  • 感谢@NicE - 我需要重新了解操作员!
  • 另外——“诊断”正是我现在所需要的。 @RHertel - 谢谢

标签: r for-loop dataframe


【解决方案1】:

这里有两种不使用循环的赋值方法。两者都使用逻辑索引并假设数据帧名为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

数据框和矩阵都有一个 colrow 函数,可以“就地”返回索引:

> 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多