我正在尝试从数据框中的列中删除附加的"s.#“:
Species <- c("Dogs.1","Dogs.2","Dogs.3","Cats.1","Cats.2","Cats.3")
Breed <- c("Great Dane","Beagle","Beagle","Bengal","Tabby","Siamese")
names(Species) <- "Species"
names(Breed) <- "Breed"
pets <- as.data.frame(cbind(Species,Breed))
这将产生以下数据帧:
Species Breed
1 Dogs.1 Great Dane
2 Dogs.2 Beagle
3 Dogs.3 Beagle
4 Cats.1 Bengal
5 Cats.2 Tabby
6 Cats.3 Siamese
我希望输出看起来更像这样:
Species Breed
1 Dog Great Dane
2 Dog Beagle
3 Dog Beagle
4 Cat Bengal
5 Cat Tabby
6 Cat Siamese
有没有办法操纵物种列来去掉".#"?
发布于 2018-07-22 22:17:07
我们可以在这里使用sub
。下面的模式将删除一个后跟一个或多个数字的点,作为Species
文本中的最后一项内容出现。我还删除了一个可选的字母s
,它可能(也可能不)出现在点之前。
pets$Species <- sub("s?\\.\\d+$", "", pets$Species)
pets
Species Breed
1 Dog Great Dane
2 Dog Beagle
3 Dog Beagle
4 Cat Bengal
5 Cat Tabby
6 Cat Siamese
发布于 2018-07-23 02:47:14
这是另一个解决方案:
library(stringr)
str_extract(pets$Species, "^.*(?=s)")
[1] "Dog" "Dog" "Dog" "Cat" "Cat" "Cat"
我经常发现,当数据帧是长格式且字符串格式为something.#或something_#时,附加在末尾的#可以保存有价值的信息,这些信息可用于分组、分面、统计和/或数据可视化。我不确定这是不是您的情况,但是这里有一种方法可以将两位信息分开,以保留附加的信息。
library(tidyr)
library(dplyr)
library(stringr)
new_pets <- pets %>%
separate(col = Species, into = c("type", "owner"), sep = "\\.") %>%
mutate(type = str_extract(type, "^.*(?=s)"))
new_pets
# type owner Breed
# 1 Dog 1 Great Dane
# 2 Dog 2 Beagle
# 3 Dog 3 Beagle
# 4 Cat 1 Bengal
# 5 Cat 2 Tabby
# 6 Cat 3 Siamese
https://stackoverflow.com/questions/51465968
复制相似问题