根据条件R更改数据子集的值

时间:2017-02-16 03:41:37

标签: r data.table dplyr

当我尝试手动更改某些值时,我遇到了一个问题

这是我的数据集

.on('connection', ...)

您可以看到第3行和第4行的类别为1.条件是第3行和第4行具有可在上一行(第2行)中找到的值,并且它们将继续到下一行(第5行)。如果是这样,它们实际上属于第2类而不是第1类(是的,我知道它很奇怪,但这是将它们视为相同的要求)。

我有多个ID。我想只识别这种数据子集,以达到预期的效果。

我已经尝试了使用类别的滞后值来创建一个标识符,从而在类别中每次减少数量。让我们忽略首先从类别中增加数量的情况。

预期输出为:

dat <- read.table(text='
id  Item                                                 Category    Next_Category
 1  "CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON"   2           2
 1  "CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON"   2           1
 1  "CRANBERRY 10PKTS CARTON"                            1           1
 1  "CRANBERRY 10PKTS CARTON"                            1           2
 1  "CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON"   2           NA
', header=TRUE)

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

我们创建一个序列列('i1'),通过n = [0;0;-1]; d = Inf; im = imread('cameraman.tif'); theta = 60*pi/180; R = [ 1 0 0 ; 0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)]; t = [0;0;0]; K=[300 0 0; 0 300 0; 0 0 1]; H=K*R/K-1/d*K*t*n'*K; tform = maketform('projective',H'); imT = imtransform(im,tform); imshow(imT) 使用', '将'Item'列拆分为'long'来重新整形'long'格式,获取'的第一个元素'类别','Next_Category',同时将'Item'与cSplit折叠,最后将'i1'指定为NULL

paste

我们也可以使用与dt1[, i1 := seq_len(.N)] library(splitstackshape) cSplit(dt1, "Item", ", ", "long")[, Category := Category[1L], .(id, Item) ][, c(list(Item = paste(Item, collapse=", ")), Category = Category[1L], Next_Category = Next_Category[1L]),.(id, i1) ][, i1 := NULL][] # id Item Category Next_Category #1: 1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON 2 2 #2: 1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON 2 1 #3: 1 CRANBERRY 10PKTS CARTON 2 1 #4: 1 CRANBERRY 10PKTS CARTON 2 2 #5: 1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON 2 NA

类似的方法
tidyverse

数据

library(tidyverse)
rownames_to_column(dat, "i1") %>% 
        separate_rows(Item, sep= ", ") %>% 
        group_by(i1, id) %>%
        mutate(Item = paste(Item, collapse=", ")) %>% 
        group_by(Item, add=TRUE) %>% 
        summarise_at(vars(Category, Next_Category), first) %>% 
        ungroup() %>% 
        select(-i1)
# A tibble: 5 × 4
#       id                                             Item Category Next_Category
#    <int>                                            <chr>    <int>         <int>
#1     1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON        2             2
#2     1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON        2             1
#3     1                          CRANBERRY 10PKTS CARTON        1             1
#4     1                          CRANBERRY 10PKTS CARTON        1             2
#5     1 CRANBERRY 10PKTS CARTON, BLUEBERRY 20PKTS CARTON        2            NA