【问题标题】:R: subtract 1 from specific column, based on value other columnR:根据其他列的值从特定列中减去 1
【发布时间】:2016-05-25 13:01:29
【问题描述】:

我正在尝试对某个列进行基本操作(例如减 1),由另一列的值(例如第一列)引用。例如:对于给定的行,第一列中的值等于 5。然后我想从同一行,第 5 列中减去 1。

数据看起来像

tmp <- data.frame(replicate(5,sample(2:5,5,rep=TRUE)))

当然,我可以通过多行代码来实现这一点,每次选择总行的子样本,满足一定条件,但我相信这个操作可以更干净和动态地执行。

附加问题:有没有一种简单的方法以相同的方式引用列名,而不是索引。例如列名“S5”?最简单的方法是通过names(tmp),然后匹配列名并使用names的索引,或者你能想到更简单的方法吗?

有什么建议吗?

【问题讨论】:

  • for (i in 1:nrow(tmp)) tmp[i, tmp[i,1]] &lt;- tmp[i, tmp[i,1]] - 1 ?
  • 不应该是for (i in 1:nrow(tmp)) tmp[i, tmp[i,1]] &lt;- tmp[i, tmp[i,5]] - 1吗?
  • 感谢您的 cmets!你完全正确@jogo。快速提问:有没有一种简单的方法可以以相同的方式引用列名,而不是索引。例如列名“S5”?最简单的方法是通过names(tmp),然后匹配列的名称并使用名称的索引,或者你能想到更简单的方法吗?

标签: r dataframe


【解决方案1】:

所以元素的列索引在该行的第一列:

for (i in 1:nrow(tmp)) tmp[i, tmp[i,1]] <- tmp[i, tmp[i,1]] - 1 

如果在第一列中将列的名称作为字符(而不是因素!),它也可以工作:

tmp <- data.frame(cInd=c("A", "B", "C"), A=1:3, B=11:13, C=21:23,
          stringsAsFactors = FALSE)
for (i in 1:nrow(tmp)) tmp[i, tmp[i,1]] <- tmp[i, tmp[i,1]] - 1 

【讨论】:

    最近更新 更多