如何在R?
中使用子集函数时忽略大小写eos91corr.data <- subset(test.data,select=c(c(X,Y,Z,W,T)))
我想选择名称为x,y,z,w,t的列。我该怎么办?
由于
答案 0 :(得分:4)
如果您可以不使用subset()
功能,tolower()
功能可能有效:
dat <- data.frame(XY = 1:5, x = 1:5, mm = 1:5,
y = 1:5, z = 1:5, w = 1:5, t = 1:5, r = 1:5)
dat[,tolower(names(dat)) %in% c("xy","x")]
但是,这将返回data.frame
,其中的列按照原始数据集dat
中的顺序排列:两者
dat[,tolower(names(dat)) %in% c("xy","x")]
和
dat[,tolower(names(dat)) %in% c("x","xy")]
将产生相同的结果,尽管目标名称的顺序已被颠倒。
如果您希望结果中的列按目标向量的顺序排列,则需要稍微更加花哨。以下两个命令都返回data.frame
,其中的列按目标向量的顺序排列(即,结果将不同,并且列已切换):
dat[,sapply(c("x","xy"),FUN=function(foo)which(foo==tolower(names(dat))))]
dat[,sapply(c("xy","x"),FUN=function(foo)which(foo==tolower(names(dat))))]
答案 1 :(得分:2)
您可以使用带有grep
函数的正则表达式来忽略识别要选择的列名称的情况。确定所需的列名后,您可以将这些名称传递给subset
。
如果您的数据是
dat <- data.frame(xy = 1:5, x = 1:5, mm = 1:5, y = 1:5, z = 1:5,
w = 1:5, t = 1:5, r = 1:5)
# xy x mm y z w t r
# 1 1 1 1 1 1 1 1 1
# 2 2 2 2 2 2 2 2 2
# 3 3 3 3 3 3 3 3 3
# 4 4 4 4 4 4 4 4 4
# 5 5 5 5 5 5 5 5 5
然后
(selNames <- grep("^[XYZWT]$", names(dat), ignore.case = TRUE, value = TRUE))
# [1] "x" "y" "z" "w" "t"
subset(dat, select = selNames)
# x y z w t
# 1 1 1 1 1 1
# 2 2 2 2 2 2
# 3 3 3 3 3 3
# 4 4 4 4 4 4
# 5 5 5 5 5 5
编辑如果列名超过一个字母,则上述方法效果不佳。因此,假设您可以在向量中获取所需的列名称,则可以使用以下内容:
upperNames <- c("XY", "Y", "Z", "W", "T")
(grepPattern <- paste0("^", upperNames, "$", collapse = "|"))
# [1] "^XY$|^Y$|^Z$|^W$|^T$"
(selNames2 <- grep(grepPattern, names(dat), ignore.case = TRUE, value = TRUE))
# [1] "xy" "y" "z" "w" "t"
subset(dat, select = selNames2)
# xy y z w t
# 1 1 1 1 1 1
# 2 2 2 2 2 2
# 3 3 3 3 3 3
# 4 4 4 4 4 4
# 5 5 5 5 5 5
答案 2 :(得分:0)
&#39; stringr&#39;库是所有这些功能的非常整洁的包装器。它有&#39; ignore.case&#39;选项如下:
also, you may want to consider using match not subset.