【问题标题】:Add empty columns to a dataframe with specified names from a vector从向量中将空列添加到具有指定名称的数据框
【发布时间】:2013-08-15 09:10:22
【问题描述】:

我有一个数据框df,其中已经包含许多数据列。我有一个向量,namevector,里面满是字符串。我需要将空列添加到 df,并使用来自 namevector 的列名称。

我正在尝试使用此 for 循环添加列,迭代 namevector 中的每个字符串。

for (i in length(namevector)) {
  df[, i] <- NA
}

但我留下了这个错误:

[&lt;-.data.frame(*tmp*, , i, value = NA) 中的错误: 新列会在现有列之后留下孔

或者,我曾考虑创建一个具有正确名称的空数据框,然后 cbind- 将两个数据框放在一起,但不知道如何进行编码。

我将如何解决这个问题?

【问题讨论】:

  • 我想你的意思可能是seq_len(length(namevector)) 或类似的东西。
  • 你的意思是for (i in (seq_len(length(namevector)) + ncol(df))) ... 然后更改列名。
  • @JamesPringle seq_len(length(...))seq_along() 的长切
  • @JamesPringle 谢谢,我忘了添加偏移量,因为他们正在添加新列。
  • @rilkehayden 见 add_column()

标签: r dataframe


【解决方案1】:

您的代码存在问题

for(i in length(namevector))

你需要问自己:length(namevector) 是什么?这是一个数字。所以本质上你是在说:

for(i in 11)
df[,i] <- NA

或者更简单地说:

df[,11] <- NA

这就是您收到错误的原因。你想要的是:

for(i in namevector)
    df[,i] <- NA

或者更简单地说:

df[,namevector] <- NA

【讨论】:

  • 请考虑将df[,namevector] &lt;- NA 移到答案的顶部,因为这是一般解决方案
【解决方案2】:
set.seed(1)
example <- data.frame(col1 = rnorm(10, 0, 1), col2 = rnorm(10, 2, 3))
namevector <- c("col3", "col4")
example[ , namevector] <- NA

example
#          col1       col2 col3 col4
# 1  -0.6264538  6.5353435   NA   NA
# 2   0.1836433  3.1695297   NA   NA
# 3  -0.8356286  0.1362783   NA   NA
# 4   1.5952808 -4.6440997   NA   NA
# 5   0.3295078  5.3747928   NA   NA
# 6  -0.8204684  1.8651992   NA   NA
# 7   0.4874291  1.9514292   NA   NA
# 8   0.7383247  4.8315086   NA   NA
# 9   0.5757814  4.4636636   NA   NA
# 10 -0.3053884  3.7817040   NA   NA

【讨论】:

  • set.seed(1) 似乎不是绝对必要的。
  • set.seed 仅被添加,因此如果用户运行代码,示例 data.frame 将是相同的。从技术上讲,rnorm 根本没有必要。
  • 是的,所以每个人运行代码的随机数都是相同的。我明白了。
【解决方案3】:

以下内容适合我

dataframe[,"newName"] <- NA

确保为新名称字符串添加""

【讨论】:

  • OP 已请求将空列添加到具有指定名称的数据框来自向量。因此,他想添加 许多 列。您的答案只添加了 one 列,并且名称 not 根据要求取自变量 namevector。因此,请查看您的帖子或考虑将其删除。谢谢。
  • 你总是可以为列列表运行循环
  • 是的,但是您的答案与建议 for(i in namevector) df[,i] &lt;- NAaccepted answer 相同
【解决方案4】:

也许

df <- do.call("cbind", list(df, rep(list(NA),length(namevector))))
colnames(df)[-1*(1:(ncol(df) - length(namevector)))] <- namevector

【讨论】:

    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2017-02-26
    • 2015-06-13
    相关资源
    最近更新 更多