如何将两列 "count" 矩阵转换为 R 中的二进制向量?
How can I convert a two-column "count" matrix to a binary vector in R?
如何在 R 中将具有两列计数矩阵的数据帧转换为具有单个二进制向量的数据帧?例如,我有一个这样的数据框,其中 id 是一个主题的 ID,s 和 f 是该主题的 "successes" 和 "failures" 的数量,x 是描述一些的第三个变量该主题的特征。
id s f x
1 0 3 A
2 2 1 A
3 1 2 B
我希望将此数据框转换为:
id n x
1 f A
1 f A
1 f A
2 s A
2 s A
2 f A
3 s B
3 f B
3 f B
其中第 n 列表示每次试验是成功 (s) 还是失败 (f)。
我确定我可以编写一个函数来执行此操作,但我想知道是否有预制解决方案。
这是使用 tidyr
、splitstackshape
包的一种方法。您使用 gather
重塑数据。然后,您可以在 splitstackshape
包中使用 expandRows
。您要求 R 按值列中的数字重复每一行。出于显示目的,我使用了 dplyr
包中的 arrange()
。但是,这部分是可选的。
library(tidyr)
library(splitstackshape)
library(dplyr)
gather(mydf, variable, value, -id, -x) %>%
expandRows("value") %>%
arrange(id, x)
# id x variable
#1 1 A f
#2 1 A f
#3 1 A f
#4 2 A s
#5 2 A s
#6 2 A f
#7 3 B s
#8 3 B f
#9 3 B f
dd <- read.table(text="id s f x
1 0 3 A
2 2 1 A
3 1 2 B",
header=TRUE)
with(dd,data.frame(
id=rep(id,s+f),
n=rep(rep(c("s","f"),nrow(dd)),c(rbind(s,f))),
x=rep(x,s+f)))
使用上面 Ben Bolker 的出色回答,我创建了一个简短的函数,它将对包含一列成功计数的任何数据框执行此操作,一列用于失败计数,以及包含有关每个列的信息的任意数量的附加列行(主题)。请参阅下面的示例。
#####################################################################
### cnt2bin (count to binary) takes a data frame with 2-column ######
### "count" response variable of successes and failures and ######
### converts it to long format, with one column showing ######
### 0s and 1s for failures and successes. ######
### data is data frame with 2-column response variable ######
### suc and fail are character expressions for columns ######
### containing counts of successes and failures respectively ######
#####################################################################
cnt2bin <- function(data, suc, fail) {
xvars <- names(data)[names(data)!=suc & names(data)!=fail]
list <- lapply(xvars, function(z) with(data, rep(get(z), get(suc)+get(fail))))
names(list) <- xvars
df <- as.data.frame(list)
with(data,data.frame(bin=rep(rep(c(1,0),nrow(data)),c(rbind(get(suc),get(fail)))),
df))
}
示例,其中 id 是主题 ID,s 和 f 是计算每个主题的成功和失败的列,x 和 y 是描述每个主题属性的变量,将被扩展并添加到最终数据框中.
dd <- read.table(text="id s f x y
1 0 3 A A
2 2 1 A B
3 1 2 B B",
header=TRUE)
cnt2bin(dd, "s", "f")
如何在 R 中将具有两列计数矩阵的数据帧转换为具有单个二进制向量的数据帧?例如,我有一个这样的数据框,其中 id 是一个主题的 ID,s 和 f 是该主题的 "successes" 和 "failures" 的数量,x 是描述一些的第三个变量该主题的特征。
id s f x
1 0 3 A
2 2 1 A
3 1 2 B
我希望将此数据框转换为:
id n x
1 f A
1 f A
1 f A
2 s A
2 s A
2 f A
3 s B
3 f B
3 f B
其中第 n 列表示每次试验是成功 (s) 还是失败 (f)。
我确定我可以编写一个函数来执行此操作,但我想知道是否有预制解决方案。
这是使用 tidyr
、splitstackshape
包的一种方法。您使用 gather
重塑数据。然后,您可以在 splitstackshape
包中使用 expandRows
。您要求 R 按值列中的数字重复每一行。出于显示目的,我使用了 dplyr
包中的 arrange()
。但是,这部分是可选的。
library(tidyr)
library(splitstackshape)
library(dplyr)
gather(mydf, variable, value, -id, -x) %>%
expandRows("value") %>%
arrange(id, x)
# id x variable
#1 1 A f
#2 1 A f
#3 1 A f
#4 2 A s
#5 2 A s
#6 2 A f
#7 3 B s
#8 3 B f
#9 3 B f
dd <- read.table(text="id s f x
1 0 3 A
2 2 1 A
3 1 2 B",
header=TRUE)
with(dd,data.frame(
id=rep(id,s+f),
n=rep(rep(c("s","f"),nrow(dd)),c(rbind(s,f))),
x=rep(x,s+f)))
使用上面 Ben Bolker 的出色回答,我创建了一个简短的函数,它将对包含一列成功计数的任何数据框执行此操作,一列用于失败计数,以及包含有关每个列的信息的任意数量的附加列行(主题)。请参阅下面的示例。
#####################################################################
### cnt2bin (count to binary) takes a data frame with 2-column ######
### "count" response variable of successes and failures and ######
### converts it to long format, with one column showing ######
### 0s and 1s for failures and successes. ######
### data is data frame with 2-column response variable ######
### suc and fail are character expressions for columns ######
### containing counts of successes and failures respectively ######
#####################################################################
cnt2bin <- function(data, suc, fail) {
xvars <- names(data)[names(data)!=suc & names(data)!=fail]
list <- lapply(xvars, function(z) with(data, rep(get(z), get(suc)+get(fail))))
names(list) <- xvars
df <- as.data.frame(list)
with(data,data.frame(bin=rep(rep(c(1,0),nrow(data)),c(rbind(get(suc),get(fail)))),
df))
}
示例,其中 id 是主题 ID,s 和 f 是计算每个主题的成功和失败的列,x 和 y 是描述每个主题属性的变量,将被扩展并添加到最终数据框中.
dd <- read.table(text="id s f x y
1 0 3 A A
2 2 1 A B
3 1 2 B B",
header=TRUE)
cnt2bin(dd, "s", "f")