【问题标题】:add new columns to a dataframe giving each column different names in a loop将新列添加到数据框中,在循环中为每列赋予不同的名称
【发布时间】:2018-01-28 15:41:14
【问题描述】:

这里我有一个数据框和向量

names  mpg   spd   wt  ast   alp
c1     0.34  12    34   43   2
c2     0.56  34    98   23   10
c1     0.9   847   43   23   20
c3      NA   234    34  34    45
c4      34    87    32   23   87 
c5      89    98    98   NA    NA

以上是我的数据框,我正在寻找(mpg,spd),(mpg,wt),(mpg,ast),(mpg,alp),(spd,wt)等属性的相关性nC2 迭代,需要将这些值附加到新数据框中具有特定名称的新列中

vec=c('c1','c2','c4','c5')
 for(i in 1:length(vec))
    { 

    tb=cbind(p1,p2)  #p1,p2 are data frames attributes for correlation eg:contains characters
    tb[,ncol(tb)+1]=b #b is a dataframe which have stored correlation values of attributes
    names(tb)[,ncol(tb)+1]=vec[i]  
    }

在这里,我想在 vector 中附加新列的名称,并在 b 中附加值 我想要的输出:

p1   p2   c1   c2    c3     c4    c5
mpg spd   43   0.4   23    87    23
mpg wt    76    23   19    43     12

【问题讨论】:

  • 在循环外分配列名:colnames(tb)[,2:(length(vec)+1)]=vec
  • 循环的目的是什么?代码很奇怪
  • @Asha 的问题一点都不清楚。你能举个例子和想要的输出吗?
  • 我已经编辑了帖子

标签: r


【解决方案1】:

假设您已经有一些数据框:

x <- data.frame(numeric(1000))

您可以使用其list 语法在循环中添加更多具有名称的列。 data.frames 毕竟是特殊列表。

> is.list(x)
[1] TRUE

您可以像这样在 for 循环中添加更多列:

vec=c('c1','c2','c4','c5','c6')
for(i in 1:length(vec)){
    newCol <- numeric(1000)
    x[[vec[i]]] <- newCol
}

导致:

> head(x)
  numeric.1000. c1 c2 c4 c5 c6
1             0  0  0  0  0  0
2             0  0  0  0  0  0
3             0  0  0  0  0  0
4             0  0  0  0  0  0
5             0  0  0  0  0  0
6             0  0  0  0  0  0

请注意,虽然这不是很好的做法,也不能很好地扩展。你真的不想像这样增长对象,因为必须重新分配内存的成本。如果您事先知道需要多少列(并且确实知道,因为您正在循环它们的名称),最好只创建整个数据框,然后在循环中填充它。

【讨论】:

    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多