确定字符在 r 中的出现
determine character occurrence in r
我有一个域名列表(例如 google.com),我想创建一个由域名列和 26 个包含字母 a-z 的新列组成的数据框。数据框行应包含每个字母出现在每个域中的计数。我可以让它为单行工作,但不能为整个数据框工作。这是我目前所拥有的:
df_letters = data_frame(domain = domain_df$domain)
df_letters[, letters] = 0
head(df_letters)
# A tibble: 6 × 27
domain a b c d e f g h i j k l
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 google.com 0 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 0 0 0 0 0 0 0 0 0 0 0 0
3 facebook.com 0 0 0 0 0 0 0 0 0 0 0 0
4 baidu.com 0 0 0 0 0 0 0 0 0 0 0 0
5 yahoo.com 0 0 0 0 0 0 0 0 0 0 0 0
6 wikipedia.org 0 0 0 0 0 0 0 0 0 0 0 0
# ... with 14 more variables: m <dbl>, n <dbl>, o <dbl>, p <dbl>, q <dbl>, r <dbl>, s <dbl>,
# t <dbl>, u <dbl>, v <dbl>, w <dbl>, x <dbl>, y <dbl>, z <dbl>
>
df_letters$domain = str_trim(df_letters$domain, side = "both")
df_letters[, 2:27] = str_count(df_letters$domain, letters)
以下警告消息与错误填写的 df_letters 数据框一起出现:
Warning message:
In stri_count_regex(string, pattern, opts_regex = opts(pattern)) :
longer object length is not a multiple of shorter object length
# A tibble: 6 × 27
domain a b c d e f g h i j k l
<chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 google.com 0 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 1 1 1 1 1 1 1 1 1 1 1 1
3 facebook.com 2 2 2 2 2 2 2 2 2 2 2 2
4 baidu.com 1 1 1 1 1 1 1 1 1 1 1 1
5 yahoo.com 0 0 0 0 0 0 0 0 0 0 0 0
6 wikipedia.org 0 0 0 0 0 0 0 0 0 0 0 0
# ... with 14 more variables: m <int>, n <int>, o <int>, p <int>, q <int>, r <int>, s <int>,
# t <int>, u <int>, v <int>, w <int>, x <int>, y <int>, z <int>
有人能帮忙吗?
这是使用 table
、do.call
和几个 *binds
:
的基本 R 替代方案
# data as a vector of strings
sites <- c("google.com", "youtube.com")
# get a list of counts of each letter, remove "."
siteList <- lapply(strsplit(sites, split=""),
function(i) table(factor(i, levels=c(".", letters)))[-1])
这里,strsplit
returns 一个列表,每个元素都包含单独的字符。此列表被馈送到 lapply
,后者在将字符向量转换为因子后使用 table
计算每个字符的计数。此转换确保每个字母都出现在 table
输出中。 [-1]
删除“.”从输出。
# construct data.frame
cbind.data.frame(sites, do.call(rbind, siteList))
sites a b c d e f g h i j k l m n o p q r s t u v w x y z
1 google.com 0 0 1 0 1 0 2 0 0 0 0 1 1 0 3 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 0 1 1 0 1 0 0 0 0 0 0 0 1 0 2 0 0 0 0 1 2 0 0 0 1 0
这里,do.call(rbind, siteList)
returns 一个矩阵,其中字母作为列名,行中每个 table 的计数。这将转换为带有 cbind.data.frame
的 data.frame,它还会添加网站名称。
我有一个域名列表(例如 google.com),我想创建一个由域名列和 26 个包含字母 a-z 的新列组成的数据框。数据框行应包含每个字母出现在每个域中的计数。我可以让它为单行工作,但不能为整个数据框工作。这是我目前所拥有的:
df_letters = data_frame(domain = domain_df$domain)
df_letters[, letters] = 0
head(df_letters)
# A tibble: 6 × 27
domain a b c d e f g h i j k l
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 google.com 0 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 0 0 0 0 0 0 0 0 0 0 0 0
3 facebook.com 0 0 0 0 0 0 0 0 0 0 0 0
4 baidu.com 0 0 0 0 0 0 0 0 0 0 0 0
5 yahoo.com 0 0 0 0 0 0 0 0 0 0 0 0
6 wikipedia.org 0 0 0 0 0 0 0 0 0 0 0 0
# ... with 14 more variables: m <dbl>, n <dbl>, o <dbl>, p <dbl>, q <dbl>, r <dbl>, s <dbl>,
# t <dbl>, u <dbl>, v <dbl>, w <dbl>, x <dbl>, y <dbl>, z <dbl>
>
df_letters$domain = str_trim(df_letters$domain, side = "both")
df_letters[, 2:27] = str_count(df_letters$domain, letters)
以下警告消息与错误填写的 df_letters 数据框一起出现:
Warning message:
In stri_count_regex(string, pattern, opts_regex = opts(pattern)) :
longer object length is not a multiple of shorter object length
# A tibble: 6 × 27
domain a b c d e f g h i j k l
<chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 google.com 0 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 1 1 1 1 1 1 1 1 1 1 1 1
3 facebook.com 2 2 2 2 2 2 2 2 2 2 2 2
4 baidu.com 1 1 1 1 1 1 1 1 1 1 1 1
5 yahoo.com 0 0 0 0 0 0 0 0 0 0 0 0
6 wikipedia.org 0 0 0 0 0 0 0 0 0 0 0 0
# ... with 14 more variables: m <int>, n <int>, o <int>, p <int>, q <int>, r <int>, s <int>,
# t <int>, u <int>, v <int>, w <int>, x <int>, y <int>, z <int>
有人能帮忙吗?
这是使用 table
、do.call
和几个 *binds
:
# data as a vector of strings
sites <- c("google.com", "youtube.com")
# get a list of counts of each letter, remove "."
siteList <- lapply(strsplit(sites, split=""),
function(i) table(factor(i, levels=c(".", letters)))[-1])
这里,strsplit
returns 一个列表,每个元素都包含单独的字符。此列表被馈送到 lapply
,后者在将字符向量转换为因子后使用 table
计算每个字符的计数。此转换确保每个字母都出现在 table
输出中。 [-1]
删除“.”从输出。
# construct data.frame
cbind.data.frame(sites, do.call(rbind, siteList))
sites a b c d e f g h i j k l m n o p q r s t u v w x y z
1 google.com 0 0 1 0 1 0 2 0 0 0 0 1 1 0 3 0 0 0 0 0 0 0 0 0 0 0
2 youtube.com 0 1 1 0 1 0 0 0 0 0 0 0 1 0 2 0 0 0 0 1 2 0 0 0 1 0
这里,do.call(rbind, siteList)
returns 一个矩阵,其中字母作为列名,行中每个 table 的计数。这将转换为带有 cbind.data.frame
的 data.frame,它还会添加网站名称。