R:根据另一列中的值计算一列中的值数
我有一个不太清楚的问题,所以我希望我能解释清楚。 我正在使用R。我知道for循环在R中可能很慢,但对我来说,在这种情况下使用for循环是可以的 我有这样一个数据帧:R:根据另一列中的值计算一列中的值数,r,R,我有一个不太清楚的问题,所以我希望我能解释清楚。 我正在使用R。我知道for循环在R中可能很慢,但对我来说,在这种情况下使用for循环是可以的 我有这样一个数据帧: id_A id_B id_C calc_A calc_B calc_C 1 x,z d g,f 1 1 5 2 x,y,z d,e f 1 2 8 3 y,z d,
id_A id_B id_C calc_A calc_B calc_C
1 x,z d g,f 1 1 5
2 x,y,z d,e f 1 2 8
3 y,z d,e g 6 7 1
count
1 3
2 5
3 1
我还有一个向量,它的名字是c('a','B','c',等等)
我想做的是计算每一行,有多少
id
有一个calc
这有点乱,但这应该可以做到(对于data.framed
):
#存储calc列和id列的索引
calc.cols我不知道这是否比jbaums解决方案更简单,但这里有另一个选项:
mydf<-data.frame(id_A=c("x,y","x,y,z","y,z"),id_B=c("d","d,e","d,e"),id_C=c("g,f","f","g"),
calc_A=c(1,1,6),calc_B=c(1,2,7),calc_C=c(5,8,1),stringsAsFactors=F)
mydf$count<-apply(mydf,1,function(rg,namesrg){
rg_calc<-rg[grep("calc",namesrg)]
rg_ids<-rg[grep("id",namesrg)]
idsinf2<-which(as.numeric( rg_calc)<=2)
ttids<-unlist(sapply(rg_ids[gsub("calc","id",names(rg_calc[idsinf2]))],function(id){strsplit(id,",")[[1]]}))
return(length(ttids))
},colnames(mydf))
> mydf
id_A id_B id_C calc_A calc_B calc_C count
1 x,y d g,f 1 1 5 3
2 x,y,z d,e f 1 2 8 5
3 y,z d,e g 6 7 1 1
mydf假设ID
列和calc
列的顺序相同
library(stringr)
indx <- sapply(df[,1:3], str_count, ",")+1
indx[df[,4:6] >2] <- NA
df$count <- rowSums(indx,na.rm=TRUE)
df
# id_A id_B id_C calc_A calc_B calc_C count
#1 x,z d g,f 1 1 5 3
#2 x,y,z d,e f 1 2 8 5
#3 y,z d,e g 6 7 1 1
set.seed(42)
df1 <- df[,sample(6)]
library(gtools)
df2 <-df1[,mixedorder(names(df1))]
# calc_A calc_B calc_C id_A id_B id_C
#1 1 1 5 x,z d g,f
#2 1 2 8 x,y,z d,e f
#3 6 7 1 y,z d,e g
id1 <- grep("^id", colnames(df2))
calc1 <- grep("^calc", colnames(df2))
indx1 <-sapply(df2[, id1], str_count, ",")+1
indx1[df2[, calc1] >2] <- NA
df1$count <- rowSums(indx1, na.rm=TRUE)
df1
# calc_C calc_B id_B id_C calc_A id_A count
#1 5 1 d g,f 1 x,z 3
#2 8 2 d,e f 1 x,y,z 5
#3 1 7 d,e g 6 y,z 1
库(stringr)
indx 2]谢谢!不幸的是,我不确定id和calc在数据帧中的位置(它也可以多于或少于4列)@Mary我更新了我的答案,将列的名称考虑在内,列可以是任意形式order@Mary-这假设id
列的顺序与calc
列的顺序相同。。。你的数据就是这样吗?(即,如果id
列按A
,B
,C
,则calc
列的顺序出现。)是的,我的数据也是如此。只有在我的真实数据中,在这些列之前还有其他与此无关的信息。(名称向量的顺序不同)@Mary我不确定名称向量的相关性。不同的id列中是否会有重复的id?e、 g.id_b是否可以包含x作为id,尽管它存在于id_a中?如果可能的话,这将如何计算?如果你看Mary的评论,id和calc的列可以超过3个,并且它们的位置不固定,所以1:3
和4:6
不能总是工作…@CathG更多的列并不重要,只要它们的顺序相同。我这么说是因为你使用的是df[,1:3]
和df[,4:6]
:如果还有id\u D
和calc\u D
(那么id列应该是1:4
和calcs列,5:8
),你的解决方案不会产生奇怪的计数吗?@akrun这是我今天要带回家的。我能读台词。像往常一样谢谢。@jazzurro没问题。我不知道这是否有效,但使用rowSums
应该更快。
set.seed(42)
df1 <- df[,sample(6)]
library(gtools)
df2 <-df1[,mixedorder(names(df1))]
# calc_A calc_B calc_C id_A id_B id_C
#1 1 1 5 x,z d g,f
#2 1 2 8 x,y,z d,e f
#3 6 7 1 y,z d,e g
id1 <- grep("^id", colnames(df2))
calc1 <- grep("^calc", colnames(df2))
indx1 <-sapply(df2[, id1], str_count, ",")+1
indx1[df2[, calc1] >2] <- NA
df1$count <- rowSums(indx1, na.rm=TRUE)
df1
# calc_C calc_B id_B id_C calc_A id_A count
#1 5 1 d g,f 1 x,z 3
#2 8 2 d,e f 1 x,y,z 5
#3 1 7 d,e g 6 y,z 1
df <- structure(list(id_A = c("x,z", "x,y,z", "y,z"), id_B = c("d",
"d,e", "d,e"), id_C = c("g,f", "f", "g"), calc_A = c(1L, 1L,
6L), calc_B = c(1L, 2L, 7L), calc_C = c(5L, 8L, 1L)), .Names = c("id_A",
"id_B", "id_C", "calc_A", "calc_B", "calc_C"), class = "data.frame", row.names = c("1",
"2", "3"))