选择R Dataframe 中包含特定字符的所有单元格

dced5bon  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个 Dataframe ,我想(1)选择所有包含 * 的单元格,然后(2)创建一个新的 Dataframe ,只包含每个星号前面的字符串。
下面是一个例子,玩具 Dataframe :

X1  <- data.frame(c("Tricho*", "Proteo", "Cyano*", "Gold", "Pseudo"))
X2 <- data.frame(c(" ", "alpha*", " ", "fish", "nitzs"))
X3 <- data.frame(c(" ", " ", " ", "bowl*", "ia"))
Data <- cbind(X1, X2, X3)

Data1 <- Data %>%
  rename("X1" = "c..Tricho.....Proteo....Cyano.....Gold....Pseudo..",
                "X2" = "c.......alpha..........fish....nitzs..",
         "X3" = "c.................bowl.....ia..")

我正在尝试制作一个 Dataframe ,如下所示:

X4
Tricho*
alpha*
Cyano*
bowl*

我认为str_extract_all可以做到这一点,或者至少返回每个星号的位置,然后我可以使用它,但是我的真实的文件要大得多,我不确定使用str_extract_all是否可行。
我还尝试使用以下内容:

Data1 <- as.character(Data1)
out <- data.frame(Data1[endsWith(Data1, '*')])
View(out)

以及

Data1 <- as.character(Data1)
out2 <- data.frame(grep('*$', Data1, value = TRUE))
View(out2)

但这两个选项都不起作用。第一个选项产生了一个空白 Dataframe ,第二个选项只产生了一个 Dataframe ,其中c(“Tricho*",“Proteo”,“Cyano*",“Gold”,“Pseudo”)作为第一行,c(““,“alpha*",““,“fish”,“nitzs”)作为第二行,等等。

nwo49xxi

nwo49xxi1#

一个选项是将所有其他值替换为NA,然后替换为unite

library(dplyr)
library(tidyr)
library(stringr)
Data1 %>% 
  mutate(across(everything(), ~ case_when(str_detect(.x, fixed("*")) ~ .x))) %>% 
  unite(X4, everything(), na.rm = TRUE)%>%
  filter(nzchar(X4))
  • 输出
X4
1 Tricho*
2  alpha*
3  Cyano*
4   bowl*

或者使用base R

X4 <- t(Data1)[t(sapply(Data1, grepl, pattern = "*", fixed = TRUE))]
data.frame(X4)

相关问题