【问题标题】:How to ignore case when using subset in R在 R 中使用子集时如何忽略大小写
【发布时间】:2012-11-13 21:00:15
【问题描述】:

在 R 中使用子集函数时如何忽略大小写?

eos91corr.data <- subset(test.data,select=c(c(X,Y,Z,W,T)))

我想选择名称为 x、y、z、w、t 的列。我该怎么办?

谢谢

【问题讨论】:

  • 您的意思是要查找姓名x,X,y,Y,z,Z,... 吗?否则,为什么要指定大写?

标签: r subset


【解决方案1】:

如果您可以不使用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))))]

【讨论】:

  • 这很好用。我遇到了另一个问题:如何保持我想要的顺序?说 dat[,tolower(names(dat)) %in% c("x","xy")]。我想保持列顺序 xy,x。我该怎么做?谢谢。
  • @Lin:我编辑了我的答案以反映您的新问题和一种可能的方法。希望这会有所帮助!
  • 斯蒂芬,你真是个专家!非常感谢!
【解决方案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

【讨论】:

  • 这太简洁了,很有帮助!非常感谢!
【解决方案3】:

'stringr' 库是所有这些功能的一个非常简洁的包装器。它有 'ignore.case' 选项如下:

     also, you may want to consider using match not subset. 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多