新用户到R所以请放轻松我。
我的数据框如:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
实际文件要大得多,并从旧硬件输出。出于某种原因,一些条目在其前面放置了“Z”。如何从整个数据集中删除?
我试过了df = gsub("Z", " ", df)
,但它只是让我胡说八道。这件事真的很棒!
[1] "1:3" "c(3, 1, 2)" "c(1, 1, 2)" "c(2, 3, 1)"
在这里查看stackoverflow并尝试了stringr包,但也无法开始工作。谁知道该怎么办?
答案 0 :(得分:2)
使用gsub()
的方法不起作用,因为该函数对向量而不是数据帧进行操作。但是,您可以apply
gsub()
覆盖数据框的每一列,以获得所需内容:
df[] <- lapply(df, function (x) {gsub("Z", "", x)})
对于stringr
解决方案(也使用dplyr
),请尝试:
library(tidyverse)
df <- mutate_all(df,
funs(str_replace_all(., "Z", "")))
P.S。我建议将来使用df <-
代替df =
。祝你好运!
编辑:纠正错字 - 谢谢@thelatemail
答案 1 :(得分:1)
您可以通过以下方式使用简单的^Z
正则表达式:
df = data.frame(Mineral = c("Zfeldspar", "Zgranite", "ZSilica"),
Confidence = c("ZLow", "High", "Med"),
Coverage = c("sub", "sub", "super"),
Aspect = c("ZPos", "ZUnd", "Neg"))
df[] <- lapply(df, sub, pattern = '^Z', replacement ="")
> df
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
^Z
模式使用^
锚点匹配字符串的开头,然后使用Z
匹配并删除sub
(因为只有一个可能匹配每个字符串都没有使用gsub
}。
答案 2 :(得分:0)
你很亲密。如果您想使用基础gsub
data$Mineral = gsub("Z", "", data$Mineral)
您可以对所有列执行此操作。或者使用apply
策略的组合(参见其他答案!)
PS。命名数据data
不是一个好主意。至少做my_data
答案 3 :(得分:0)
你可以这样做:
as.data.frame(sapply(data, function(x) {gsub("Z", "", x)}))
答案 4 :(得分:0)
你问过如何在stringr(/ stringi)包中做到这一点,以避免得到你所得到的不需要的索引向量:
> as.data.frame(apply(df, 2,
function(col) stringr::str_replace_all(col, '^Z', '')))
> as.data.frame(apply(df, 2,
function(col) stringi::stri_replace_first_regex(col, '^Z', '')))
Mineral Confidence Coverage Aspect
1 feldspar Low sub Pos
2 granite High sub Und
3 Silica Med super Neg
(需要as.data.frame()
调用才能将输出数组转换回df R: apply-like function that returns a data frame?
)
至于弄清楚如何在整个数据帧上调用str*_replace
函数,我试过......
stri_replace_first_fixed(df, '^Z', '')
stri_replace_first_fixed(df[1,], '^Z', '')
stri_replace_first_fixed(df[,1], '^Z', '')
只有最后一个正常工作。无可否认str*_replace
上存在设计缺陷,他们至少应该识别无效对象并产生有用的错误信息,而不是喷出索引。