R:根据另一列中的值计算一列中的值数

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,

我有一个不太清楚的问题,所以我希望我能解释清楚。 我正在使用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,e     g          6        7       1
   count
1   3
2   5
3   1
我还有一个向量,它的名字是
c('a','B','c',等等)

我想做的是计算每一行,有多少
id
有一个
calc
这有点乱,但这应该可以做到(对于data.frame
d
):

#存储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"))