在 dplyr 中,如何删除和重命名不存在的列、操作所有名称以及使用字符串命名新变量?
In dplyr, how to delete and rename columns that don't exist, manipulate all names, and name a new variable using a string?
如何使用dplyr
简化或执行以下操作:
运行 所有 data.frame
名称的函数,例如 mutate_each(funs())
的值,例如
names(iris) <- make.names(names(iris))
删除不存在的列(即不删除任何内容),例如
iris %>% select(-matches("Width")) # ok
iris %>% select(-matches("X")) # returns empty data.frame, why?
按名称(字符串)添加新列,例如
iris %>% mutate_("newcol" = 0) # ok
x <- "newcol"
iris %>% mutate_(x = 0) # adds a column with name "x" instead of "newcol"
重命名不存在的 data.frame colname
names(iris)[names(iris)=="X"] <- "Y"
iris %>% rename(sl=Sepal.Length) # ok
iris %>% rename(Y=X) # error, instead of no change
- 我会为此使用 setNames:
iris %>% setNames(make.names(names(.)))</pre>
- 包括 everything() 作为 select:
的参数
iris %>% select(-matches("Width"), everything())
iris %>% select(-matches("X"), everything())</pre>
- 据我了解,除了像您已经这样做的那样明确命名字符串之外,没有其他捷径:
iris %>% mutate_("newcol" = 0)</pre>
上面回答了 1 到 3。我来这里是因为我和4号有同样的问题。这是我的解决方案:
df <- iris
使用要重命名的列和新值设置名称键:
name_key <- c(
sl = "Sepal.Length",
sw = "Sepal.Width",
Y = "X"
)
将不在数据框中的值设置为 NA。这更适合我的目的。您可能只需将其从 name_key
.
中删除
for (var in names(name_key)) {
if (!(name_key[[var]] %in% names(df))) {
name_key[var] <- NA
}
}
获取数据框中列名的向量。
cols <- names(name_key[!is.na(name_key)])
重命名列
for (nm in names(name_key)) {
names(df)[names(df) == name_key[[nm]]] <- nm
}
Select 列
df2 <- df %>%
select(cols)
我几乎肯定这可以更优雅地完成,但这是我目前所拥有的。希望这对您有所帮助,如果您还没有解决它的话!
我为 #4 提出了以下解决方案:
iris %>%
rename_at(vars(everything()),
function(nm)
recode(nm,
Sepal.Length="sl",
Sepal.Width = "sw",
X = "Y")) %>%
head()
最后一行当然是为了方便输出
问题 n.2 的答案:
如果您想明确给出列的全名,可以使用函数 any_of
。
iris %>%
select(-any_of(c("X", "Sepal.Width","Petal.Width")))
这不会删除不存在的列 X,但会删除列出的其他两列。
否则,您可以使用 matches
或 any_of
和 matches
的组合解决方案。
iris %>%
select(-any_of("X")) %>%
select(-matches("Width"))
这将显式删除 X 和匹配项。也可以进行多次匹配。
iris %>%
select(-any_of("X")) %>%
select(-matches(c("Width", "Spec"))) # use c for multiple matches
如何使用dplyr
简化或执行以下操作:
运行 所有
data.frame
名称的函数,例如mutate_each(funs())
的值,例如names(iris) <- make.names(names(iris))
删除不存在的列(即不删除任何内容),例如
iris %>% select(-matches("Width")) # ok iris %>% select(-matches("X")) # returns empty data.frame, why?
按名称(字符串)添加新列,例如
iris %>% mutate_("newcol" = 0) # ok x <- "newcol" iris %>% mutate_(x = 0) # adds a column with name "x" instead of "newcol"
重命名不存在的 data.frame colname
names(iris)[names(iris)=="X"] <- "Y" iris %>% rename(sl=Sepal.Length) # ok iris %>% rename(Y=X) # error, instead of no change
- 我会为此使用 setNames:
iris %>% setNames(make.names(names(.)))</pre>
- 包括 everything() 作为 select:
的参数iris %>% select(-matches("Width"), everything()) iris %>% select(-matches("X"), everything())</pre>
- 据我了解,除了像您已经这样做的那样明确命名字符串之外,没有其他捷径:
iris %>% mutate_("newcol" = 0)</pre>
上面回答了 1 到 3。我来这里是因为我和4号有同样的问题。这是我的解决方案:
df <- iris
使用要重命名的列和新值设置名称键:
name_key <- c(
sl = "Sepal.Length",
sw = "Sepal.Width",
Y = "X"
)
将不在数据框中的值设置为 NA。这更适合我的目的。您可能只需将其从 name_key
.
for (var in names(name_key)) {
if (!(name_key[[var]] %in% names(df))) {
name_key[var] <- NA
}
}
获取数据框中列名的向量。
cols <- names(name_key[!is.na(name_key)])
重命名列
for (nm in names(name_key)) {
names(df)[names(df) == name_key[[nm]]] <- nm
}
Select 列
df2 <- df %>%
select(cols)
我几乎肯定这可以更优雅地完成,但这是我目前所拥有的。希望这对您有所帮助,如果您还没有解决它的话!
我为 #4 提出了以下解决方案:
iris %>%
rename_at(vars(everything()),
function(nm)
recode(nm,
Sepal.Length="sl",
Sepal.Width = "sw",
X = "Y")) %>%
head()
最后一行当然是为了方便输出
问题 n.2 的答案:
如果您想明确给出列的全名,可以使用函数 any_of
。
iris %>%
select(-any_of(c("X", "Sepal.Width","Petal.Width")))
这不会删除不存在的列 X,但会删除列出的其他两列。
否则,您可以使用 matches
或 any_of
和 matches
的组合解决方案。
iris %>%
select(-any_of("X")) %>%
select(-matches("Width"))
这将显式删除 X 和匹配项。也可以进行多次匹配。
iris %>%
select(-any_of("X")) %>%
select(-matches(c("Width", "Spec"))) # use c for multiple matches