我目前正在开发一个应用程序,我需要遍历数据框的各列。例如,如果数据框具有列
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)
}
提前谢谢!
答案 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
中没有任何值。