循环遍历R中的特定列名称

时间:2013-11-07 15:38:17

标签: r for-loop dataframe

我有一个数据框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)]]但这些似乎都没有工作要么。

有什么想法吗?

3 个答案:

答案 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))
}

注意事项(也许):

  • for (i in seq_along(specialnames))seq_along(或i in 1:length(specialnames)或类似的东西)非常重要。
  • 您似乎误解了[[[的使用。尝试以下方法来了解他们的工作:
    • mydf["A"]
    • mydf[["A"]]
    • mydf[1, c("A", "B")]
  • 要查看herehere两个问题。

答案 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