6

我有一个数据框 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 的列。有没有不同的语法可以给我呢?

我在这篇文章中读到 “$ 用于交互使用。相反,在编程时,即要解释列名时,您需要使用 [ 或 [[,因此我将 sample$i.imp 替换为 sample [[paste0(i, '.impt')]]"。

根据此评论,我猜想我一直在寻找的语法可能是 AData$[i] 或 AData$[[i]] 或 AData$[[paste0(i)]] 但这些似乎都不起作用。

有任何想法吗?

4

3 回答 3

4

你在你的循环中非常接近——在你的使用和意义中只有一个微妙的特征[[[你错过了。有关详细信息,请参阅Hadley Wickham 关于子集的注释。

要获得您想要的性能(分配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
于 2013-11-07T18:25:17.680 回答
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)类似的东西)很重要。
  • 您似乎误解了[and的用法[[。尝试以下方法来了解他们的工作:
    • mydf["A"]
    • mydf[["A"]]
    • mydf[1, c("A", "B")]
  • 有两个问题要看这里这里
于 2013-11-07T15:49:40.737 回答
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通常用于缺失值,请参见此处

于 2013-11-07T15:44:08.400 回答