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
如下
- 查看 A 列中唯一值的计数。示例 - X=3、Y=2、Z=3
- 对于A列中的每个唯一值,求B列的总和。例如,当A列有x时,B列总和为1。当A列有z时,B列总和为0
- 将计算 1 除以计算 2 并求出 %。 X=1/3,Y=2/2,Z=0/3
创建一个包含以下值的新列
• 如果计算 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" ]
我有如下数据。
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
如下
- 查看 A 列中唯一值的计数。示例 - X=3、Y=2、Z=3
- 对于A列中的每个唯一值,求B列的总和。例如,当A列有x时,B列总和为1。当A列有z时,B列总和为0
- 将计算 1 除以计算 2 并求出 %。 X=1/3,Y=2/2,Z=0/3
创建一个包含以下值的新列
• 如果计算 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" ]