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




