我在 R 中有一个大数据集,我的问题与此数据集中的8个不同变量有关,询问人们的情况。网络。变量都将代码分配给不同的人,指定与此人的关系..
我想将答案代码汇总为两组(friends = 1,family = 2),然后创建一个新变量,计算8个变量中有多少朋友和家人列出。
我希望这是可以理解的,我将非常感谢你的帮助。
这就是我的数据的样子:
[117,] id 106 201 202 102 103 452 452 501
[118,] id 106 201 202 302 301 451 NA NA
[119,] id 201 202 106 102 105 601 602 602
[120,] id 106 201 202 406 301 302 NA NA
我想要两个变量来计算每个参与者的朋友和家人的绝对数量。
101-452是家庭代码,除了106和120
501-801是朋友代码,除了702
答案 0 :(得分:0)
这可能比你想要的更加迂回,但这个解决方案很简单。由于您没有提供dput()
数据帧,我冒昧地重新创建您发布的数据帧:
dF <- as.data.frame(matrix(data = c("id", 106, 201, 202, 102, 103, 452, 452, 501,
"id", 106, 201, 202, 302, 301, 451, NA, NA,
"id", 201, 202, 106, 102, 105, 601, 602, 602,
"id", 106, 201, 202, 406, 301, 302, NA, NA),
ncol = 9, nrow = 4, byrow = T))
names(dF) <- c("value", paste0("c", seq(1:8)))
由于id
值,我还必须调整dF中每列的类:
#Change each column to a numeric variable
dF$c1 <- as.numeric(as.character(dF$c1))
dF$c2 <- as.numeric(as.character(dF$c2))
dF$c3 <- as.numeric(as.character(dF$c3))
dF$c4 <- as.numeric(as.character(dF$c4))
dF$c5 <- as.numeric(as.character(dF$c5))
dF$c6 <- as.numeric(as.character(dF$c6))
dF$c7 <- as.numeric(as.character(dF$c7))
dF$c8 <- as.numeric(as.character(dF$c8))
接下来,您必须创建一些告诉R
什么是family
和friend
的方式:
#101-452 are family codes apart from 106 and 120
#501-801 are friend codes, apart from 702
fam <- as.numeric(c(101:105, 107:119, 121:452))
fnd <- as.numeric(c(501:701, 703:801))
我编写了一个名为SumIn()
的函数,以确定dF
或fam
中fnd
的每一行中的每个值是否都显示为:
SumIn <- function(x){
#Create a sum for each row of your dataframe where the column value is
# within the parameters you've given for both "family" and "friend"
valFam <- sum(x %in% fam, na.rm = T)
valFnd <- sum(x %in% fnd, na.rm = T)
#Combine the two
vals <- as.data.frame(t(rbind(valFam, valFnd)))
return(vals)
}
我创建了一个新的数据框,以简化操作,但您可以轻松地将其应用于当前的数据框:
newDf <- as.data.frame(matrix(NA, ncol = 11, nrow = nrow(dF)))
names(newDf) <- c("id", paste0("c", seq(1:8)), "sumFam", "sumFnd")
newDf$id <- "id"
因为您只想应用原始dF中的数字,只需将dF子集到apply()
到这些列。
for(i in 1:nrow(dF)){
newDf[i, 2:11] <- cbind(dF[i, 2:9], apply(dF[i, ], 1, SumIn))
}
> newDf
id c1 c2 c3 c4 c5 c6 c7 c8 sumFam sumFnd
1 id 106 201 202 102 103 452 452 501 6 1
2 id 106 201 202 302 301 451 NA NA 5 0
3 id 201 202 106 102 105 601 602 602 4 3
4 id 106 201 202 406 301 302 NA NA 5 0
您应该可以取消创建newDf
并将其直接应用于您的数据框。我刚刚在这里做了一个例子。
这可能有点 hacky ,但它很简单,不需要一堆R知识。我确信还有其他方法可以获得你需要的结果。