我有一个包含不同数量元素的长列表,这些元素也可以在同一个字段中重复出现 这是前五行的一个例子:
A <- list(c("JAMES","CHARLES","JAMES","RICHARD"),
c("JOHN","ROBERT","CHARLES"),
c("CHARLES","WILLIAM","CHARLES","MICHAEL","WILLIAM","DAVID","CHARLES","WILLIAM"),
c("CHARLES"),
c("CHARLES","CHARLES"))
现在我想计算列表每一行的元素数量 我想要的输出看起来与此相似:
[1] 4
[2] 3
[3] 7
[4] 1
[5] 2
除此之外,我想知道每行中出现“CHARLES”一词的频率 基于我的例子,我想获得类似于此的输出:
[1] 1
[2] 1
[3] 3
[4] 1
[5] 2
我想到了这个:
> table(A)
Error in table(A) : all arguments arguments must have same length
> sum(A)
Error in sum(A) : invalid 'type' (list) of argument
但不幸的是,我不知道如何应对这些错误信息并且不知道替代方案 我知道列表的行数是:
> length(A)
[1] 5
但不幸的是,这并没有回答我的问题。我也找不到任何其他答案 因此,我想请你帮我计算这两项措施!
非常感谢您提前!
答案 0 :(得分:6)
sapply(A, function(x) length(x))
[1] 4 3 8 1 2
un <- unique(unlist(A))
nm <- lapply(un, function(x) sapply(A, function(y) sum(y == x)))
names(nm) <- un
nm
$JAMES
[1] 2 0 0 0 0
$CHARLES
[1] 1 1 3 1 2
$RICHARD
[1] 1 0 0 0 0
$JOHN
[1] 0 1 0 0 0
$ROBERT
[1] 0 1 0 0 0
$WILLIAM
[1] 0 0 3 0 0
$MICHAEL
[1] 0 0 1 0 0
$DAVID
[1] 0 0 1 0 0
答案 1 :(得分:6)
您应该熟悉lapply
和sapply
来循环列表:
sapply(A, length)
[1] 4 3 8 1 2
sapply(A, function(x)sum(grepl("CHARLES", x)))
[1] 1 1 3 1 2
grepl()
的作用是将正则表达式与文本匹配,并根据是否匹配返回TRUE或FALSE。然后我对这些逻辑值进行sum()
,即将TRUE值相加。
答案 2 :(得分:3)
用于计算列表A的元素长度。您可以使用以下命令:
list.len <- lapply(1:length(A),function(x) length(A[[x]]))
unlist(list.len)
[1] 4
[2] 3
[3] 7
[4] 1
[5] 2
用于计算“CHARLES”出现在列表的每个元素中的次数,您可以执行以下操作:
len.name <- lapply(1:length(A),function(x) length(which(A[[x]] == "CHARLES")))
len.name
[[1]]
[1] 1
[[2]]
[1] 1
[[3]]
[1] 3
[[4]]
[1] 1
[[5]]
[1] 2
然后你可以取消列出
unlist(len.name)
然后你会得到输出:
[1] 1
[2] 1
[3] 3
[4] 1
[5] 2