如何动态分配列名给变量

时间:2019-01-15 08:04:00

标签: r

我目前正在开发一个应用程序,我需要遍历数据框的各列。例如,如果数据框具有列

char_set <- data.frame(character(),character(),character(),character(),stringsAsFactors = FALSE)
names(char_set) <-  c("a","b","c","d")

如果输入指定为“ a”,则应将列名“ b”分配给变量,例如promote。 它将引发错误Error in [。data.frame (char_set, i + 1) : undefined columns selected。有什么解决办法吗?

char_name <- "a"
char_set <- data.frame(character(),character(),character(),character(),stringsAsFactors = FALSE)
names(char_set) <-  c("a","b","c","d")
for (i in 1:ncol(char_set)) {
  promote <- ifelse(names(char_set) == char_name,char_set[i+1], "-")
  print(promote)
}

提前谢谢!

2 个答案:

答案 0 :(得分:0)

这实际上很有趣。我建议在这些线上做些事情:

char_name <- "a"
char_set <- data.frame(
    a = 1:2,
    b = 3:4,
    c = 5:6,
    d = 8:9,
    stringsAsFactors = FALSE
)
res_dta <- data.frame(matrix(nrow = 2, ncol = 3))
for (i in wrapr::seqi(1, NCOL(char_set) - 1)) {
    print(i)
    if (names(char_set)[i] == char_name) {
        res_dta[i] <- char_set[i + 1]
    } else {
        res_dta[i] <- char_set[i]
    }
}

结果

char_set
  a b c d
1 1 3 5 8
2 2 4 6 9
res_dta
  X1 X2 X3
1  3  3  5
2  4  4  6

有几个通用要点:

  • 在遍历列时,请注意不要超出数据框的尺寸;在i + 1上运行i = 4会给您第5列,该列将为包含四列的数据帧返回错误。然后,您可以决定少运行一列,或者中断特定的i
  • 不确定我的请求是否正确,对于列名a,您想获取列b的值;然后列b保持原样?
    • 从广义上讲,我认为这个names(char_set)[i] == char_name需要更多的思考,但是您首先要从这个答案开始。用期望的结果更新您的帖子将有助于设计解决方案。

答案 1 :(得分:0)

您的代码中的问题是您要从1循环到char_set df的列数,然后才调用变量char_set[i+1]。 这样,当i索引取最大值时,指令char_set[i+1]返回错误,因为该索引没有元素。

您可以尝试以下解决方案:

char_name<-"a"

promote<-ifelse((which(names(char_set)==char_name)+1)<ncol(char_set),names(char_set)[which(names(char_set)==char_name)+1],"-")

promote
> [1] "b"

char_name<-"d"

promote<-ifelse((which(names(char_set)==char_name)+1)<ncol(char_set),names(char_set)[which(names(char_set)==char_name)+1],"-")
promote

> [1] "-"

但是。当变量char_name取值为a时,变量promote将采用集合char_set在名为a的元素之后的位置处的值,该元素与char_name相匹配。

我建议您考虑以下情况:变量char_name取值为d,并且char_set之后的d中没有任何值。