在R中的特定列名子集上循环
我有一个dataframe AData,我提取了它的列名的某个子集,比如SpecialNames。我想知道如何在for循环中引用这些列 我当前的代码如下所示:在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
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