例如,我想将CJ
与数量灵活的具有灵活名称的列一起使用
J = 3
temp = CJ(paste0('Q', 1) = 0:100)
if(J > 1){
for(j in 2:J){
temp = CJ(temp,paste0('Q', j) = 0:100))
}
}
对于任意J。
输出为:
CJ(Q1 = 0:100, Q2 = 0:100, Q3 = 0:100)
Q1 Q2 Q3
1: 0 0 0
2: 0 0 1
3: 0 0 2
4: 0 0 3
5: 0 0 4
---
1030297: 100 100 96
1030298: 100 100 97
1030299: 100 100 98
1030300: 100 100 99
1030301: 100 100 100
答案 0 :(得分:2)
这是do.call
的经典案例:
temp = do.call(CJ, replicate(J, 0:100, simplify = FALSE))
setnames(temp, paste0('Q', 1:J))
temp
# Q1 Q2 Q3
# 1: 0 0 0
# 2: 0 0 1
# 3: 0 0 2
# 4: 0 0 3
# 5: 0 0 4
# ---
# 1030297: 100 100 96
# 1030298: 100 100 97
# 1030299: 100 100 98
# 1030300: 100 100 99
# 1030301: 100 100 100
可以使用setNames
和lapply
而不是replicate
在一行中构造它,但是IMO的可读性要差得多。 setnames
几乎是瞬时的,因此没有效率问题。