【问题标题】:Index for for-loop not working wellfor循环的索引不能正常工作
【发布时间】:2015-10-15 03:00:42
【问题描述】:

我有两个数据框

数据框a

a   A   1   4   7
b   B   2   5   8
c   C   3   6   9

数据框b

a   A   10  13  16
b   B   11  14  17
c   C   12  15  18

我希望创建一个新的数据框c,它保留a 的前两列,并从第 3 列到第 5 列添加相应的数字元素。

我使用了以下代码:

c<-data.frame(matrix(NA, nrow=3, ncol=5))

 for (i in 1:5) {
     if (i==1:2) {c[,i] <- a[,i]}
     else        {c[,i] <- round((a[,i]+b[,i])/2,0)}
 }

write.xlsx(c, "c.xlsx")

但是,输出看起来像 Excel 中的以下内容

    X1  X2  X3  X4  X5
1   a   #N/A    11  17  23
2   b   #N/A    13  19  25
3   c   #N/A    15  21  27

我认为i==1:2 部分可能有问题,请问我应该如何修改代码?

谢谢!

【问题讨论】:

  • 请使用dput。在您的问题中,添加dput(a)dput(b) 的输出。
  • 在这种情况下使用 %in% 而不是 ==
  • 谢谢。效果很好。既然%in%== 都会返回一个逻辑值向量,我可以知道为什么%in% 在这种情况下效果很好,而== 不行吗?
  • 使用i = 1,查看i == 1:2i %in% 1:2 的输出。前者产生 2 逻辑,因为您要询问 i 是否等于 1 和 2。后者产生 1 逻辑,因为它会询问 i 是否等于 1 或 2。

标签: r for-loop data-manipulation


【解决方案1】:

这可能会有所帮助

a = read.table(header = F, stringsAsFactors = F,  text  = "a   A   1   4   7
b   B   2   5   8
c   C   3   6   9")


b = read.table(header = F, stringsAsFactors = F,  text  = "a   A   10  13  16
b   B   11  14  17
c   C   12  15  18")


# Using for loop:

c = data.frame(matrix(NA, nrow=3, ncol=5))
for (i in 1:5) {
  if (i %in% 1:2) {c[,i] <- a[,i]}
  else {c[,i] <- round((a[,i]+b[,i])/2,0)}
}



# Even without a loop: 

c = cbind(a[,1:2], round((a[,3:5] + b[,3:5]) / 2, 0))
print(c)
#   V1 V2 V3 V4 V5
# 1  a  A  6  8 12
# 2  b  B  6 10 12
# 3  c  C  8 10 14

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多