在R中的特定列名子集上循环

在R中的特定列名子集上循环,r,for-loop,dataframe,R,For Loop,Dataframe,我有一个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

我有一个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

}

SpecialNames对于
循环,您不需要
,您可以直接访问列。以下是一个例子:

Adata <- data.frame(a=rnorm(5), b=rnorm(5), c=rnorm(5))
SpecialNames <- c("b", "c")
Adata[,SpecialNames] <- NA

是否确实要使用
NULL
NA
通常用于缺少的值,请参见。

由于不知道自己在做什么,很难说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)

mydf您的循环非常接近-
[
[[
的使用和含义中有一个您缺少的细微特征。有关详细信息,请参阅Hadley Wickham关于子集的说明


要获得您想要的性能(分配
NULL
以删除列),您必须使用
[
。使用
mydf[,specialnames]您可以提供一些示例数据和您想要的结果吗?尝试阅读。您在
R
中遇到了我认为有点设计缺陷的
Adata[,specialnames]值得注意的是,
Adata[,SpecialNames]
## 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 (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