将空列添加到向量中具有指定名称的 Dataframe

mwg9r5ms  于 2023-01-06  发布在  其他
关注(0)|答案(6)|浏览(174)

我有一个 Dataframe df,其中已经有很多数据列。我有一个向量namevector,其中充满了字符串。我需要将空列添加到df中,并使用namevector中的列的名称。
我尝试用这个for循环添加列,迭代namevector中的每个字符串。

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

但我留下了这个错误:
[<-.data.frame中的错误(*tmp*,,i,值= NA):新列将在现有列之后留下孔洞
或者,我考虑过创建一个具有正确名称的空 Dataframe ,然后将两个 Dataframe cbind-ing在一起,但不确定如何进行编码。
我该怎么解决这个问题呢?

a0zr77ik

a0zr77ik1#

您的代码的问题在于以下行:

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
nue99wik

nue99wik2#

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
eqzww0vc

eqzww0vc3#

下面是我的作品

dataframe[,"newName"] <- NA

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

gwo2fgha

gwo2fgha4#

我更喜欢基本的R解决方案,但这里有一个tidyverse解决方案。下面使用mutate,但如果使用tibble::add_column,语法是相同的:

library(dplyr)

new_columns <- c("A", "B", "C")

iris %>% 
  mutate(!!!setNames(rep(NA, length(new_columns)), new_columns))

拼接运算符使用setNames中的名称-值对创建列。
如果列表中已经有了名称-值对,那么只需执行以下操作:

new_columns <- list(A = NA, B = 1, C = "c")

iris %>% 
  mutate(!!!new_columns)

如果每个列表元素的长度为1,则循环使用其值,否则,它需要具有与 Dataframe 相同的长度(例如list(A = 1:150)。

lhcgjxsq

lhcgjxsq5#

向 Dataframe 添加空列的另一种方法。

df <- data.frame(name0 = c(1,2,3))
namevector <- c("name1", "name2", "name3")

sapply(namevector, function(x){df[x] <<- numeric()})
  • 使用〈〈-操作符消除了for循环。
  • 在许多这些示例中,与新的空列相关联的类型将是逻辑的;然而,通过指定numeric(),类型将是numeric。2其他类型,如double()或character(),也可以指定。
rnmwe5a2

rnmwe5a26#

也许吧

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

相关问题