0

我对在 R 中执行我想要的最佳方式有点迷茫。

我有一个包含几列的数据框。其中之一是用户和其他列,比如说数字(0,1,2,3,4,5)。有时用户会重复,但在这种情况下,列号应该有一个数字序列。可以是这样的:

user number  column B column C
1    0        85      200
2    1        165     852
1    2        200     1000
3    0        15      689
3    1        89      896
4    0        78      582
4    2        96      586 

我想获得的是:

user number status days
1    0      0       200
3    0      1       50 ->(value column C, user 3, number 1)-(value column B, user 3, number 0)
4    0      0       200

我想根据这些用户的值向数据框中添加两列。

  • 如果用户有一个数字 == 0 但用户是唯一状态 == 0 并且天数 == 一些预定义的数字
  • 如果用户有一个数字 == 0 并且用户不是唯一的
    • 如果用户的第二次出现有一个数字 == 1,状态 == 1 并且天应该是从值列 C 的第二次出现用户 - 值列 B 的第一次用户出现的减法
    • 如果用户的第二次出现有一个数字!= 1,状态 == 0 和天 == 一些预定义的数字
  • 从数据集中删除没有编号 == 0 的用户

我问这个问题是因为我对最好的方法有点困惑。我虽然对数字 == 0 的数据帧进行子集化,然后比较数据帧之间的用户以查看重复的用户,但这也许不是最好的方法。

任何指示和想法都会很棒!

感谢您的帮助

编辑

B 列是自“2002-01-01”以来经过的天数。例如,第一个用户在 2002-01-01 后 85 天输入数据框

C 列是用户观察的天数。那些日子之后,用户不再在数据库中。

编辑2

我的数据集有 36 列和 26075 行

经过一些建议,我到目前为止在哪里。

#remove from dataset all users that don't have number == 0
df1 <- df[df$user %in% df[df$number == 0,1],]

df1["Status"] <- 0

#doesn't work
df1[df1$number == 1 %in% df1[duplicated(df1$user),]]

我试图做的是找到所有重复的用户,如果数字等于 1。之后尝试这样的事情:

 df1[df1$number == 1 %in% df1[duplicated(df1$user),]] <- df1$Status == 1
4

2 回答 2

1

也许为每个用户设置一个 data.frame 的子集并不是最有效的方法,但如果您在几秒钟内不需要答案,它对于您的数据量可能已经足够了。

ids = unique(df1$user);
status.days = sapply(ids,function(id) {
   udf = subset(df1,subset= user == id);
   if (nrow(udf) == 1) {
     status = 0;
     days = XXX; # the predefined value.
   } else if (udf$number[2] != 1) {
     status = 0;
     days = XXX; # the predefined value;
   } else {
     status = 1;
     days = udf$columnC[2] - udf$columnB[1];
   }
   c(status,days)
});

status = sapply(status.days,simplify=T,function(sd) { sd[1] });
days = sapply(status.days,simplify=T,function(sd) { sd[2] });

result = data.frame(user=ids,number=rep(0,length(ids)),status=status,days=days)

我必须承认,我不确定从时间列表“status.days”中提取状态和天数的索引...也许应该是 sd[1] 和 sd[2] 而不是 sd[1][1 ] , sd[1][2] 或 sd[[1]][1], sd[[1]][2]

于 2013-01-11T13:59:05.910 回答
1
 #order the dataset by columns needed
 df2 <- df2[order(df2$user, df2$number),]

 ids <- unique(df2$user)

 #create variable status and days
 status <- NULL
 end <- NULL
 for (i in 1:length(ids)) {
     aux <- df2[df2$user %in% ids[i],]
     if (nrow(aux) == 1 & aux$number[1] == 0){
          status[i] <- 0
          days[i] <- end
     } else if (nrow(aux) > 1) {
          status[i] <- 1
          days[i] <- aux$Event[2]
     } else {
          status[i] <- NA
          days[i] <- NA
     }
 }

 #merge the vector created with the database
 data <- data.frame(ids, status, days)
 df2 <- df2[!duplicated(df2$user),]
 df2 <- merge(df2, data, by.x="user", by.y="ids")

 #remove NAs from the dataset
 df.f <- df2[!(is.na(df2$days)),]
于 2013-01-22T09:11:40.530 回答