我有一个数据框AData,我已经提取了其列名的某个子集,如SpecialNames。我想知道如何在for循环中引用这些列。
我目前的代码如下:
SpecialNames <- setdiff(colnames(AData), colnames(BData))
for ( i in SpecialNames ) {
AData$i <- NULL # Do something to AData$i such as delete it or something else
}
唉,AData $ i似乎没有引用名为i的数据帧AData列。是否有不同的语法可以给我这个?
我在这篇文章here中读到:“$用于交互式使用。相反,在编程时,即要解释列名时,你需要使用[或[,因此我更换了使用样本[[paste0(i,'。impt')]]“。
示例$ i.imp基于这个评论,我猜测也许我一直在寻找的语法是AData $ [i]或AData $ [[i]]或AData $ [[paste0(i)]]但这些似乎都没有工作要么。
有什么想法吗?
答案 0 :(得分:4)
不知道你在做什么,很难说for
循环是否可行;但是,希望这有助于您的出路:
## Sample data is always nice
set.seed(1)
mydf <- data.frame(A = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4),
B = LETTERS[c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2)],
matrix(sample(100, 36, replace = TRUE), nrow = 12))
## Here is your vector of special names
specialnames <- setdiff(names(mydf), c("A", "B"))
## Here is a `for` loop that will print the first two rows
## of each column named in "specialnames"
## THIS IS NOT HOW I WOULD NORMALLY DO THIS IN R
## -------------------------------------------------------
for (i in seq_along(specialnames)) {
print(head(mydf[specialnames[i]], 2))
}
注意事项(也许):
答案 1 :(得分:4)
你的循环非常接近 - 你遗漏的[
和[[
的使用和含义只是一个微妙的特征。有关详细信息,请参阅Hadley Wickham关于子集化的this注释。
要获得您想要的效果(指定NULL
删除列),您必须使用[[
。使用mydf[, specialnames] <- NULL
会抛出错误。
我同意这有点令人困惑,因为mydf[, specialnames] <- NA
会起作用:我认为这是前者改变data.frame
的结构而后者不这样做的结构。 。
因此你的功能变为:
for (name in specialnames) {
mydf[[name]] <- NULL
}
所以我们已经做好了准备:
set.seed(1)
mydf <- data.frame(A = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4),
B = LETTERS[c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2)],
matrix(sample(100, 36, replace = TRUE), nrow = 12))
## Here is your vector of special names
specialnames <- setdiff(names(mydf), c("A", "B"))
在循环之后我们将获得:
R> mydf
A B
1 1 A
2 1 A
3 1 A
4 2 A
5 2 A
6 3 B
7 3 B
8 3 B
9 3 B
10 4 B
11 4 B
12 4 B
答案 2 :(得分:1)
您不需要for
循环,您可以直接访问列。这是一个例子:
Adata <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5))
SpecialNames <- c("b", "c")
Adata[,SpecialNames] <- NA
给你:
a b c
1 -0.95619055 NA NA
2 -0.20250939 NA NA
3 -1.06609997 NA NA
4 0.06337307 NA NA
5 0.77234892 NA NA
您确定要使用NULL
吗? NA
通常用于缺失值,请参阅here。