R 数一数“的次数”;x";“按行显示时”;x";这是一个因素

R 数一数“的次数”;x";“按行显示时”;x";这是一个因素,r,R,当列是因子时,如何计算“B”或“C”按行显示的次数?我知道如何使用rowSums()如果是数字,但我不知道如何计算因子级别 拥有: 更新 rowSums()对于我的实际用例失败,因为我的数据框有日期列。下面是一个更好的玩具示例: df2 <- data.frame(v1=factor(c("A", "A", "A", "B")), v2=factor(c("A", "B", "B", "B")), v3=factor(

当列是因子时,如何计算“B”或“C”按行显示的次数?我知道如何使用
rowSums()
如果是数字,但我不知道如何计算因子级别

拥有:

更新

rowSums()
对于我的实际用例失败,因为我的数据框有日期列。下面是一个更好的玩具示例:

df2 <- data.frame(v1=factor(c("A", "A", "A", "B")),
                  v2=factor(c("A", "B", "B", "B")),
                  v3=factor(c("C", "A", "B", "B")),
                  v4=as.Date("1998-12-17"))

df2使用您的数据帧并假设您对第1行到第4行感兴趣
试试这个:

mapply(function(x) {tapply(as.vector(as.matrix(df[x,])), as.vector (as.matrix(df[x,])), length)},  1:4)
结果如下:

[[1]]

A C 

2 1 

[[2]]

A B

2 1 

[[3]]

A B 

1 2 

[[4]]

B 

3 

结果是一个列表列表,每个子列表为每行提供所有分组的计数。这是关于行中的值的一个相当一般的概念。

使用数据框并假设您对行1到4感兴趣 试试这个:

mapply(function(x) {tapply(as.vector(as.matrix(df[x,])), as.vector (as.matrix(df[x,])), length)},  1:4)
结果如下:

[[1]]

A C 

2 1 

[[2]]

A B

2 1 

[[3]]

A B 

1 2 

[[4]]

B 

3 
结果是一个列表列表,每个子列表为每行提供所有分组的计数。这是关于行中的值的相当一般的问题。

来自@davidernburg:

rowSums(df == "C" | df == "B")
这适用于原始的
df
示例。我的实际用例在数据框中有日期列,所以失败了。一种基于@Frank想法的改进方法:

rowSums(df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="B" | df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="C", na.rm=T)
这可能是一种更简洁的编码方式,但它是有效的:

#[1] 1 1 2 3
来自@davidernburg:

rowSums(df == "C" | df == "B")
这适用于原始的
df
示例。我的实际用例在数据框中有日期列,所以失败了。一种基于@Frank想法的改进方法:

rowSums(df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="B" | df2[sapply(df2, is.factor) | sapply(df2, is.character)]=="C", na.rm=T)
这可能是一种更简洁的编码方式,但它是有效的:

#[1] 1 1 2 3

简化版本可以是
行和(df==“C”| df==“B”)
。更难看但更一般的可能是
colSums(apply(df,1,`%in%`,字母[2:3])
请阅读
?行和
关于参数
x
:“两个或更多维度的数组,包含数字、复数、整数或逻辑值。还建议阅读:
?TRUE
:”在需要数值的上下文中,逻辑向量被强制为整数向量”。好的,谢谢。我认为我的实际用例抱怨了您的方法@davidernburg,因为我在数据框中有一些日期列。@Frank,所以我需要限制为因子(或实际情况中的字符串)列然后运行
rowSums
cols@EricGreen抱歉,我的建议是错误的。你可以按照David的建议做,不包括日期行,是:
rowSums(df[,-date\u col\u nums]==“B”;-date\u col\u nums]==“C”)
简化版本可以是
rowSums(df==“C”\df==“B”)
。更难看但更一般的可能是
colSums(apply(df,1,`%in%`,字母[2:3])
请阅读
?行和
关于参数
x
:“包含数字、复数、整数或逻辑值的二维或多维数组。还建议阅读:
?TRUE
:“在需要数值的上下文中,逻辑向量被强制为整数向量”。好的,谢谢。我想我的实际用例抱怨了你的方法,@DavidArenburg,因为我在数据框中有一些日期列。@Frank,所以我需要限制到factor(或字符串)列,然后运行
rowSums
cols@EricGreen对不起,我的建议是错误的。您可以按照David的建议执行,不包括日期行,是:
rowSums(df[,-date\u col\u nums]=“B”\df[,-date\u col\u nums]=“C”)