计算 R 中数据框中的元素
Count elements in a dataframe in R
我有一个这样的数据框:
ID TYPE
100010700239816 932100Y
100010700239816 9DDDDDDY
100010700239822 0000000000011222211121110100000000000000Y
输出应该是这样的:
ID 9 3 2 1 0 Y D
100010700239816 2 1 1 1 2 2 6
100010700239822 0 0 5 9 11 1 0
所以这只是一个样本数据,单个单元格内可能有不同的元素,而所有这些元素的计数正是我要查找的。
我试过了:
a <- count(TEST$TYPE)
和
a <- table(TEST$TYPE)
但是我无法获得 id 的元素计数,我该怎么做?
我们可以拆分 'TYPE',按 'ID' 和 dcast
分组为 'wide' 格式
library(data.table)
dcast(setDT(df1)[, unlist(strsplit(TYPE, "")) , ID], ID ~V1)
我们还可以使用 tidyverse
中的函数。我们可以 strsplit
字符串,unnest
字符串和 count
每个字符串-ID 组合的数字。最后,我们可以spread
数据框来得到想要的输出(dt2
)。
dt <- read.table(text = " ID TYPE
100010700239816 932100Y
100010700239816 9DDDDDDY
100010700239822 0000000000011222211121110100000000000000Y",
header = TRUE, stringsAsFactors = FALSE)
library(tidyverse)
dt2 <- dt %>%
mutate(TYPE = strsplit(TYPE, "")) %>%
unnest() %>%
count(ID, TYPE) %>%
spread(TYPE, n, fill = 0) %>%
select(c("ID", "9", "3", "2", "1", "0", "Y", "D"))
另一种方法 stringr
df2 <- aggregate(TYPE ~ ID, data=df, FUN=paste, collapse='')
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- 0
library(stringr)
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- sapply(colnames(df2[, unique(unlist(strsplit(df2$TYPE, "")))]),
function(i) str_count(df2$TYPE, i))
我有一个这样的数据框:
ID TYPE
100010700239816 932100Y
100010700239816 9DDDDDDY
100010700239822 0000000000011222211121110100000000000000Y
输出应该是这样的:
ID 9 3 2 1 0 Y D
100010700239816 2 1 1 1 2 2 6
100010700239822 0 0 5 9 11 1 0
所以这只是一个样本数据,单个单元格内可能有不同的元素,而所有这些元素的计数正是我要查找的。
我试过了:
a <- count(TEST$TYPE)
和
a <- table(TEST$TYPE)
但是我无法获得 id 的元素计数,我该怎么做?
我们可以拆分 'TYPE',按 'ID' 和 dcast
分组为 'wide' 格式
library(data.table)
dcast(setDT(df1)[, unlist(strsplit(TYPE, "")) , ID], ID ~V1)
我们还可以使用 tidyverse
中的函数。我们可以 strsplit
字符串,unnest
字符串和 count
每个字符串-ID 组合的数字。最后,我们可以spread
数据框来得到想要的输出(dt2
)。
dt <- read.table(text = " ID TYPE
100010700239816 932100Y
100010700239816 9DDDDDDY
100010700239822 0000000000011222211121110100000000000000Y",
header = TRUE, stringsAsFactors = FALSE)
library(tidyverse)
dt2 <- dt %>%
mutate(TYPE = strsplit(TYPE, "")) %>%
unnest() %>%
count(ID, TYPE) %>%
spread(TYPE, n, fill = 0) %>%
select(c("ID", "9", "3", "2", "1", "0", "Y", "D"))
另一种方法 stringr
df2 <- aggregate(TYPE ~ ID, data=df, FUN=paste, collapse='')
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- 0
library(stringr)
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- sapply(colnames(df2[, unique(unlist(strsplit(df2$TYPE, "")))]),
function(i) str_count(df2$TYPE, i))