R 复杂数据帧中的真/假计数

R 复杂数据帧中的真/假计数,r,dataframe,R,Dataframe,我试图在R中做一些相当复杂的事情,但我不确定从哪里开始 我有一个看起来有点像这样的数据框: main_val sub_val bit_one bit_two one a 1 1 one a 1 0 one a 1 1 one b 1 0 two a 1 1 two b 1

我试图在R中做一些相当复杂的事情,但我不确定从哪里开始

我有一个看起来有点像这样的数据框:

main_val sub_val bit_one bit_two
 one      a        1       1
 one      a        1       0
 one      a        1       1
 one      b        1       0
 two      a        1       1
 two      b        1       1
 two      a        1       1
现在我要计算0、1、2和3的数量,这些数字由每个主值的每个子值的位表示。因此,这应该返回:

main_val sub_val  0s  1s  2s  3s
 one       a      0   0   1   2
 one       b      0   0   1   0
 two       a      0   0   0   2
 two       b      0   0   0   1

有没有想过怎么做?我只能想到丑陋的for循环,这将花费很长时间(这将在大量数据上运行)。

请原谅我之前的评论-我认为您实际上只需要
table()
restrape()
就可以在base R中执行此操作。但是,如果数据量确实很大,它可能会变慢,此时我建议调查
数据表

# Start by turning of stringsAsFactors
options(stringsAsFactors = FALSE)

# Create fake data
fake.data <- data.frame(main_val = c("one","one","one","one","two","two","two"),
                        sub_val = c("a","a","a","b","a","b","a"),
                        bit_one = c(1,1,1,1,1,1,1),
                        bit_two = c(1,0,1,0,1,1,1))

# Generate a decimal representation of your two bits
fake.data$decimal <- fake.data$bit_one*1 +fake.data$bit_two*2

# Create a table of the results, then reshape it
fake.data.summary <- as.data.frame(table(Main=fake.data$main_val,
                                         Sub=fake.data$sub_val,
                                         Value=fake.data$decimal))

fake.data.summary <- reshape(data = fake.data.summary,
                             v.names = "Freq",
                             idvar = c("Main","Sub"),
                             timevar = "Value",
                             direction = "wide")
#开始时,先旋转字符串
选项(stringsAsFactors=FALSE)
#创建假数据

fake.data正如@TARehman在他的回答中已经提到的,对于大型数据集,您可能需要使用
data.table
。因此,
data.table
是@TARehman答案的替代方案:

library(data.table)
df2 <- dcast(setDT(df)[, .("dec" = paste0("d",(bit_one*1 + bit_two*2))), by = .(main_val,sub_val)
                       ][, .N, by = .(main_val,sub_val,dec)], 
             main_val + sub_val ~ dec, value.var = "N", fill = 0)

我相信您需要聚合函数。我会给你写一个答案和一个例子。这是一个两位二进制数,@davidernburg-如果我读对了问题的话。我想你需要将他给出的数字编码成二进制(0到3,用两位表示)。@davidernburg它现在给出的输出与另一个答案相同。谢谢,这正是我所需要的!嘿,如果我想添加另一个变量,称之为main_companion,即与main_val的1:1对应关系。例如,main可以是'1','2','3'。。。主成分是1,2,3。我如何让这些数据保留在重塑后的数据中?我尝试将它作为一个新变量添加到idvar、timevar和variable中,每次都会崩溃。一般来说,如果你还有其他问题,最好再问一次,以防我不能及时回答。这样,您还可以添加错误消息、最小工作示例和其他内容。
> df2
   main_val sub_val d1 d3
1:      one       a  1  2
2:      one       b  1  0
3:      two       a  0  2
4:      two       b  0  1