合并两个列表组件

6

我有一个很长的列表,但是下面是一个微小的例子:

A <- c("A", "a", "A", "a", "A")
B <- c("A", "A", "a", "a", "a")
C <- c(1, 2, 3, 1, 4) 
mylist <- list(A=A, B=B, C= C)

预期输出是将A和B合并,使每个组件看起来像AB。
AA, aA, Aa, aa, Aa

更好的做法是进行排序,大写字母始终排在前面。
AA, Aa, Aa, aa, Aa

因此,新的列表或矩阵应该有两列或两行:
AA, Aa, Aa, aa, Aa
1,   2, 3,   1, 4

现在我想根据课程-"AA","Aa"和"aa"计算C的平均值。看起来很简单,但我无法轻易地解决它。
3个回答

2
> (ab <- paste(A, B, sep="") )
[1] "AA" "aA" "Aa" "aa" "Aa"
> (ab <- paste(A, B, sep="") )  # the joining step
[1] "AA" "aA" "Aa" "aa" "Aa"
> (ab <- sub("([a-z])([A-Z])", "\\2\\1", ab) ) # swap lowercase uppercase
[1] "AA" "Aa" "Aa" "aa" "Aa"

> rbind(ab, C)                  # matrix
   [,1] [,2] [,3] [,4] [,5]
ab "AA" "Aa" "Aa" "aa" "Aa"
C  "1"  "2"  "3"  "1"  "4" 
> data.frame(alleles=ab, count=C)  # dataframes are lists
  alleles count
1      AA     1
2      Aa     2
3      Aa     3
4      aa     1
5      Aa     4

2
如果您的数据使用plyr包在data.frame中排列,我可以完成这项任务。
> A <- c("A", "a", "A", "a", "A")
> B <- c("A", "A", "a", "a", "a")
> C <- c(1, 2, 3, 1, 4) 
> groups <- sort(paste(A, B, sep=""))
[1] "AA" "aA" "Aa" "aa" "Aa"
> my.df <- data.frame(A=A, B=B, C=C, group=groups)

> require(plyr)
> result <- ddply(my.df, "group", transform, group.means=mean(C))
> result[order(result$group, decreasing=TRUE),]
  A B C group group.means
5 A A 1    AA         1.0
3 A a 3    Aa         3.5
4 A a 4    Aa         3.5
2 a A 2    aA         2.0
1 a a 1    aa         1.0

1

使用您的数据:

A <- c("A", "a", "A", "a", "A")
B <- c("A", "A", "a", "a", "a")
C <- c(1, 2, 3, 1, 4) 

我使用 A 和 B 的组合作为关键列来定义一个 data.frame

AB <- paste(A, B, sep='')
df <- data.frame(id=AB, C=C)

> df
  id C
1 AA 1
2 aA 2
3 Aa 3
4 aa 1
5 Aa 4

如果您需要在聚合之前对此data.frame进行排序,则:
df <- df[order(AB, decreasing=TRUE),]

> df
  id C
 1 AA 1
 3 Aa 3
 5 Aa 4
 2 aA 2
 4 aa 1

使用aggregate函数,您可以计算每个id的平均值:

meanDF <- aggregate(C~id, data=df, mean)

> meanDF

  id   C
1 aa 1.0
2 aA 2.0
3 Aa 3.5
4 AA 1.0

但是如果你想在聚合之后进行排序,那么:

df <- data.frame(id=AB, C=C)
meanDF <- aggregate(C~id, data=df, mean)
meanDF <- meanDF[order(meanDF$id, decreasing=TRUE),]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接