计算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出现在数据框中的单独一行。