R table 数据并创建额外的列

R table data and create additional columns

我有如下数据。

A=c(rep("x",3),rep("Y",2),rep("Z",3))

B=c(0,1,0,1,1,0,0,0)

new=data.frame(A,B)

我想创建一列 -modified_zip 如下

  1. 查看 A 列中唯一值的计数。示例 - X=3、Y=2、Z=3
  2. 对于A列中的每个唯一值,求B列的总和。例如,当A列有x时,B列总和为1。当A列有z时,B列总和为0
  3. 将计算 1 除以计算 2 并求出 %。 X=1/3,Y=2/2,Z=0/3
  4. 创建一个包含以下值的新列

    • 如果计算 1 高于 100 且计算 3 高于 65%,则 modified_zip 的值为 65%above100

    • 如果计算 1 大于 100 且计算 3 小于 35%,则 modified_zip 的值为 35%above100

    • 如果计算 1 高于 100 且计算 3 在 35% 到 65 之间,则 modified_zip 的值为 otherabove100

    • 如果计算 1 在 50 到 100 之间并且计算 3 在 65% 以上,则 modified_zip 的值为 65%between50and100

    • 如果计算 1 在 50 到 100 之间,而计算 3 低于 35%,则 modified_zip 的值为 35%between50and100

    • 如果计算 1 在 50 到 100 之间,计算 3 在 35% 到 65% 之间,则 modified_zip 的值为 otherbetween50and100

    • 如果计算 1 在 10 到 50 之间并且计算 3 在 65% 以上,则 modified_zip 的值为 65%between10and50

    • 如果计算 1 在 10 到 50 之间,而计算 3 低于 35%,则 modified_zip 的值为 35%between10and50

    • 如果计算 1 介于 10 到 50 之间,计算 3 介于 35% 和 65% 之间,则 modified_zip 的值为 otherbetween10and50

    • 如果计算 1 小于 10,则 modified_zip 的值为 smallnumber

我尝试使用 table 命令,但不知道如何使用 % 和计数,两者都

#Look at count of unique values in column 
library(sqldf)
sqldf("select A, count(A) from new group by A")

#for each unique value in column A, find sum of column B. 
sqldf("select A, count(A), sum(B) as sumB from new group by A")

# Divide calculation 1 by calculation 2
new1      <- sqldf("select A, count(A), sum(B) as sumB from new group by A")
new1$calc <- new1$`count(A)`/new1$sumB
new1$calc[is.infinite(new1$calc)] <- 0
new1$calc <- new1$calc*100

你有一长串规则,其中几乎 none 适用于你的例子,因为你的最高计算 1 是 3,但是当你知道如何做 1 时,你就知道如何做所有的他们,所以我会给你 1 个例子:

#create a new column that will have below values
new1$modified_zip <- NA
new1$modified_zip[new1$`count(A)` > 100 & new1$calc > 65] <- "65%above100"

另一种方式,使用`data.table'

library( data.table )
setDT(new)

by 参数将告诉 data.table 分别计算 "A"

的每个唯一值
new[ , calc1 := sum( B ), by = A ]

.N 是table(或给定的by集合)rows/observations/...的个数预设值

new[ , calc2 := B / .N, by = A ]

现在添加你想要的字符列,并开始填充子集。这里举一个例子,因为正如@Hack-R 所说,一旦你知道怎么做,你就知道怎么做了:

new[ , modified_zip := as.character( NA ) ]
new[ calc1 > 100 & calc2 > 0.65, modified_zip := "65%above100" ]