计算R中子字符串的实例数

计算R中子字符串的实例数,r,R,我有这样一个数据帧: # ID Gender 1 01 () (Male) (Female) 2 02 (Male) 3 03 (Female) 4 04 (Female) (Female) 5 05 (Male) (Male) (Male) 对于每个实例,我想添加三个新列: # ID Gender Gender-Male Gender-Female Gender-Null 这些列中的每一列都计算实例中有多少()子字符串(男性)和(女性)子字符串。基本上这意味着,例如,3名男子参

我有这样一个数据帧:

# ID  Gender
1 01  () (Male) (Female)
2 02  (Male)
3 03  (Female)
4 04  (Female) (Female)
5 05  (Male) (Male) (Male)
对于每个实例,我想添加三个新列:

# ID Gender Gender-Male Gender-Female Gender-Null
这些列中的每一列都计算实例中有多少()子字符串(男性)和(女性)子字符串。基本上这意味着,例如,3名男子参加了该会议,或2名妇女和1名无效实体,等等

实现这一目标的最佳方式是什么?带有正则表达式的“for”循环?或者我是否应该使用更好的库?

1)将性别中的
()
替换为
Null
,并删除性别中的括号。然后将性别分成几行,对每个ID和性别统计行数。最后将其扩展到更广泛的形式

library(dplyr)
library(tidyr)

counts <- DF %>%
  mutate(Gender = gsub("()", "Null", Gender, fixed = TRUE), 
         Gender = gsub("[()]", "", Gender)) %>%
  separate_rows(Gender) %>%
  count(ID, Gender) %>%
  spread(Gender, n, fill = 0)

left_join(DF, counts)
2)或仅使用base R将性别字符串拆分为单独字符串的列表
spl
,然后将其堆叠到数据帧
long
。最后用
xtabs
将其制成表格

spl <- setNames(strsplit(as.character(DF$Gender), " "), DF$ID)
long <- setNames(stack(spl), c("Gender", "ID"))
counttab <- xtabs(~ ID + Gender, long)

merge(DF, cbind(ID = rownames(counttab), as.data.frame.matrix(counttab)))
注 我们将其用作输入:

Lines <- "#,ID,Gender
1,01,() (Male) (Female)
2,02,(Male)
3,03,(Female)
4,04,(Female) (Female)
5,05,(Male) (Male) (Male)"
DF <- read.csv(text = Lines, check.names = FALSE)
1)将Gender中的
()
替换为
Null
,并删除Gender中的括号。然后将性别分成几行,对每个ID和性别统计行数。最后将其扩展到更广泛的形式

library(dplyr)
library(tidyr)

counts <- DF %>%
  mutate(Gender = gsub("()", "Null", Gender, fixed = TRUE), 
         Gender = gsub("[()]", "", Gender)) %>%
  separate_rows(Gender) %>%
  count(ID, Gender) %>%
  spread(Gender, n, fill = 0)

left_join(DF, counts)
2)或仅使用base R将性别字符串拆分为单独字符串的列表
spl
,然后将其堆叠到数据帧
long
。最后用
xtabs
将其制成表格

spl <- setNames(strsplit(as.character(DF$Gender), " "), DF$ID)
long <- setNames(stack(spl), c("Gender", "ID"))
counttab <- xtabs(~ ID + Gender, long)

merge(DF, cbind(ID = rownames(counttab), as.data.frame.matrix(counttab)))
注 我们将其用作输入:

Lines <- "#,ID,Gender
1,01,() (Male) (Female)
2,02,(Male)
3,03,(Female)
4,04,(Female) (Female)
5,05,(Male) (Male) (Male)"
DF <- read.csv(text = Lines, check.names = FALSE)

行老实说,您最好规范化数据,并将每个性别/ID出现在数据框中的单独一行。老实说,您最好规范化数据,并将每个性别/ID出现在数据框中的单独一行。