列表对象中所有表的总行数和除以列数?
Total rows and divide by columns of all tables in a list object?
我有一个包含多个 table 的列表对象,其中包含一个年份列,然后是特定单词的频率。每个 table 的尺寸可能会略有不同,具体取决于年份范围和使用的单词。
Year
word1
word2
word3
2009
1
5
4
2010
2
3
5
我想创建一个 table 来对每一行(不包括年份)求和,然后将列值除以行总和,以便生成如下所示的 table:
Year
word1
word2
word3
2009
0.1
0.5
0.4
2010
0.2
0.3
0.5
有没有办法对列表对象执行此操作? TIA
这个有用吗:
cbind(df[1], t(apply(df[-1], 1, function(x) x/sum(x))))
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
如果您有此类数据帧的列表:
mylist <- list(df, df)
mylist
[[1]]
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
[[2]]
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
lapply(mylist, function(y) cbind(y[1], t(apply(y[-1], 1, function(x) x/sum(x)))))
[[1]]
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
[[2]]
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
使用的数据:
df
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
对于单个data.frame,可以使用如下函数:
doit <- function(df) {
cbind(df[1],sweep(df[-1],1,rowSums(df[-1]),"/"))
}
例如
df <- data.frame(Year = 1:3, Word1 = c(1,2,3), Word2 = c(3,2,1), Word3 = c(6,6,6))
doit(df)
# Year Word1 Word2 Word3
#1 1 0.1 0.3 0.6
#2 2 0.2 0.2 0.6
#3 3 0.3 0.1 0.6
如果列表中有多个 data.frame,只需用 lapply
包裹所有内容,例如 lapply(dfList,doit)
.
我有一个包含多个 table 的列表对象,其中包含一个年份列,然后是特定单词的频率。每个 table 的尺寸可能会略有不同,具体取决于年份范围和使用的单词。
Year | word1 | word2 | word3 |
---|---|---|---|
2009 | 1 | 5 | 4 |
2010 | 2 | 3 | 5 |
我想创建一个 table 来对每一行(不包括年份)求和,然后将列值除以行总和,以便生成如下所示的 table:
Year | word1 | word2 | word3 |
---|---|---|---|
2009 | 0.1 | 0.5 | 0.4 |
2010 | 0.2 | 0.3 | 0.5 |
有没有办法对列表对象执行此操作? TIA
这个有用吗:
cbind(df[1], t(apply(df[-1], 1, function(x) x/sum(x))))
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
如果您有此类数据帧的列表:
mylist <- list(df, df)
mylist
[[1]]
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
[[2]]
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
lapply(mylist, function(y) cbind(y[1], t(apply(y[-1], 1, function(x) x/sum(x)))))
[[1]]
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
[[2]]
Year word1 word2 word3
1 2009 0.1 0.5 0.4
2 2010 0.2 0.3 0.5
使用的数据:
df
Year word1 word2 word3
1 2009 1 5 4
2 2010 2 3 5
对于单个data.frame,可以使用如下函数:
doit <- function(df) {
cbind(df[1],sweep(df[-1],1,rowSums(df[-1]),"/"))
}
例如
df <- data.frame(Year = 1:3, Word1 = c(1,2,3), Word2 = c(3,2,1), Word3 = c(6,6,6))
doit(df)
# Year Word1 Word2 Word3
#1 1 0.1 0.3 0.6
#2 2 0.2 0.2 0.6
#3 3 0.3 0.1 0.6
如果列表中有多个 data.frame,只需用 lapply
包裹所有内容,例如 lapply(dfList,doit)
.