You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言循环处理data.frame遇Subscript out of bounds错误及公司名拼接需求

解决下标越界问题+实现公司名称拼接方案

嘿,我来帮你搞定这两个问题——先解决循环时的Subscript out of bounds下标越界错误,再实现你要的「Company A & Company B」格式的名称拼接。

先看你的原始数据代码:

companya <- c("AML Steels Ltd.")
companyb <- c("Dev Information Technology Ltd.")
companyc <- c("Jyotirgamya Enterprises Ltd. ")
companyd <- c("Navketan Merchants Ltd. ")
data_withconame1 <- data.frame(companya, companyb, companyc, companyd)

一、为啥会出现下标越界?

你用循环处理时踩坑,大概率是这几个原因:

  • 循环的索引超出了数据的列数/行数:比如你的数据只有4列,要是循环时索引写到5,肯定报错
  • 搞混了行索引和列索引:你的数据是单行4列,要是循环时误按行来取值,自然会越界
  • 循环的起止值设错了:比如外层循环写到了等于列数的位置,内层循环又从1开始,就会重复或者超出范围

二、最省心的拼接方案(完全避免下标越界)

别手动写容易出错的循环啦,R里的combn()函数天生就是用来生成这种两两组合的,用它来实现需求超简单:

完整可运行代码

# 你的原始数据
companya <- c("AML Steels Ltd.")
companyb <- c("Dev Information Technology Ltd.")
companyc <- c("Jyotirgamya Enterprises Ltd. ")
companyd <- c("Navketan Merchants Ltd. ")
data_withconame1 <- data.frame(companya, companyb, companyc, companyd)

# 生成所有两两列的索引组合(比如1&2、1&3这类)
col_pairs <- combn(ncol(data_withconame1), 2)

# 遍历每一组组合,生成你要的输出格式
for (i in 1:ncol(col_pairs)) {
  # 取出当前组的两个列索引
  current_cols <- col_pairs[, i]
  # 生成类似"1,2"的索引字符串
  idx_text <- paste(current_cols, collapse = ",")
  # 获取对应的公司名称,顺便去掉末尾多余空格(你的c、d公司名有 trailing space)
  comp1 <- trimws(as.character(data_withconame1[1, current_cols[1]]))
  comp2 <- trimws(as.character(data_withconame1[1, current_cols[2]]))
  # 拼接成目标格式
  result_text <- paste0(comp1, " & ", comp2)
  # 按照你给的示例格式输出
  cat(sprintf("[1] \"%s\" %s\n", idx_text, result_text))
}

代码为啥好用?

  • combn(ncol(data_withconame1), 2):自动生成4列中所有两两组合的索引,完全不用你手动算范围,从根源上避免下标越界
  • trimws():帮你清理公司名称末尾的多余空格,输出更整洁
  • sprintf():精准匹配你要的输出格式,和示例完全对齐

运行后你会得到这样的结果:

[1] "1,2" AML Steels Ltd. & Dev Information Technology Ltd.
[1] "1,3" AML Steels Ltd. & Jyotirgamya Enterprises Ltd.
[1] "1,4" AML Steels Ltd. & Navketan Merchants Ltd.
[1] "2,3" Dev Information Technology Ltd. & Jyotirgamya Enterprises Ltd.
[1] "2,4" Dev Information Technology Ltd. & Navketan Merchants Ltd.
[1] "3,4" Jyotirgamya Enterprises Ltd. & Navketan Merchants Ltd.

三、要是你非要手动写循环(怎么避免越界)

如果你坚持要自己写循环,那一定要把索引范围卡死,绝对不能超出列数:

# 手动双重循环,只遍历i<j的组合,确保索引永远合法
total_cols <- ncol(data_withconame1)
for (i in 1:(total_cols - 1)) {
  for (j in (i + 1):total_cols) {
    idx_text <- paste(i, j, collapse = ",")
    comp1 <- trimws(as.character(data_withconame1[1, i]))
    comp2 <- trimws(as.character(data_withconame1[1, j]))
    result_text <- paste0(comp1, " & ", comp2)
    cat(sprintf("[1] \"%s\" %s\n", idx_text, result_text))
  }
}

这里的关键是:外层循环只到total_cols - 1,内层循环从i+1开始到total_cols,这样永远不会出现超出4的索引,彻底规避下标越界问题。

内容的提问来源于stack exchange,提问作者Robin_Hcp

火山引擎 最新活动