如何将data.table与循环

时间:2016-11-24 09:57:12

标签: r data.table

我的数据框如下所示:

> data <- data.frame(A=c(1,1,1,2,2,3,3,3,3,3), B=c("1A","1B","1C","2A","2B","3A","3B","3C","3D","3E"))

我想添加一个在变量A和B的函数中标记的新变量。结果必须是:

  > data
   A  B LABEL
1  1 1A   1-2
2  1 1B   2-3
3  1 1C   3-4
4  2 2A   1-2
5  2 2B   2-3
6  3 3A   1-2
7  3 3B   2-3
8  3 3C   3-4
9  3 3D   4-5
10 3 3E   5-6

我尝试使用data.table函数。我尝试的代码:

> setDT(data)
> data <- data[,list(LABEL = for(i in 1:length(A)){paste(i, "-", i+1, sep="")}),by=c("A","B")]   

消息错误:[.data.table中的错误(数据,,列表(LABEL = for(i in 1:length(A)){:   第一组的j结果的第1列为NULL。我们依赖第一个结果的列类型来确定剩余组的预期类型(并要求一致性)。对于以后的组,可以接受NULL列(并且这些列被替换为适当类型的NA并且被回收)但不适用于第一组。请使用类型化的空向量,例如integer()或numeric()。

3 个答案:

答案 0 :(得分:3)

我们可以使用shift来创建&#39;引导&#39;将&#39; A&#39;和paste分组后的序列值与行序列一起创建&#39; LABEL&#39;

library(data.table)
setDT(data)[, LABEL := paste(seq_len(.N), shift(seq_len(.N),
                          type='lead', fill= .N+1), sep="-"), by = A]

或者

setDT(data)[, LABEL := paste(seq_len(.N), seq_len(.N)+1, sep = "-"), by = A]
data
#    A  B LABEL
# 1: 1 1A   1-2
# 2: 1 1B   2-3
# 3: 1 1C   3-4
# 4: 2 2A   1-2
# 5: 2 2B   2-3
# 6: 3 3A   1-2
# 7: 3 3B   2-3
# 8: 3 3C   3-4
# 9: 3 3D   4-5
#10: 3 3E   5-6

或者我们可以使用base R方法

i1 <- sequence(tabulate(data$A))
data$LABEL <- paste(i1, i1+1, sep="-")
data$LABEL
#[1] "1-2" "2-3" "3-4" "1-2" "2-3" "1-2" "2-3" "3-4" "4-5" "5-6"

答案 1 :(得分:3)

您也可以使用dplyr :: mutate

    <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title> Mobtech </title>

        <!--Ubaci bootstrap css -->
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <link rel="stylesheet" href="css/style.css">
        <link rel="css/basic-template.css" rel="stylesheet">
        <link href="https://fonts.googleapis.com/css?family=Roboto+Condensed" rel="stylesheet"> <!-- Nas font -->

    </head>
    <body>
        <!--Slider -->
            <div class="container">
                <div class="row">
                    <div class="col-lg-12 col-sm-12"> 

                        <div id="mojslider" class="carousel slide" data-ride="carousel">

                            <!-- Indikatori (male tacke na slajderu) -->
                            <ol class="carousel-indicators">
                                <li data-target="#mojslider" data-slider-to="0" class="active"> </li>
                                <li data-target="#mojslider" data-slider-to="1"> </li>
                                <li data-target="#mojslider" data-slider-to="2"> </li>
                            </ol>
                            <!-- Slajd-slike -->
                            <div class="carousel-inner" role="listbox">
                                <!--Svaki div je jedan slajd -->
                                <div class="item active">
                                    <img src="Slike/samsung.png" alt="samsungslide" />
                                    <div class="carousel-caption">
                                        <h1> <font face="Roboto Condensed" size="15" color="white"> Samsung Galaxy s7  </font> </h1>
                                    </div>
                                </div>
                                <div class="item">
                                    <img src="Slike/iphone.png" alt="iphoneslide" />
                                    <div class="carousel-caption">
                                        <h1> <font face="Roboto Condensed" size="15" color="white"> iPhone 7 </font> </h1>
                                    </div>
                                </div>
                                <div class="item">
                                    <img src="Slike/lg.png" alt="lglide" />
                                    <div class="carousel-caption">
                                        <h1> <font face="Roboto Condensed" size="15" color="white"> LG V10 </font> </h1>
                                    </div>
                                </div>
                            </div>
                            <!-- Kontrole - next i prev dugme -->
                            <a class="left carousel-control" href="#mojslider" role="button" data-slide="prev">
                                <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"> </span>
                            </a>
                            <a class="right carousel-control" href="#mojslider" role="button" data-slide="next">
                                <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"> </span>
                            </a>


                        </div>

                    </div>
                </div>
            </div>

            <br/>

            <!--Container 1 - Mobtech - uvek sa Vama! -->
            <div class="container"> 
                <div class="row">
                    <!-- Kolona na velikom ekranu (lg) prikazuje duzinu jedne kolone, Ekstra small (xs) prikazuje 4 kolone -->
                    <div class="col-lg-12 bg-zelenapozadina"> 
                        <div class="col-lg-12 bg-zelenapozadina">
                            <center> <font face="Roboto Condensed" size="6"> Mobtech - uvek sa Vama ! </font> </center>
                            <p> 
                            <font face="Roboto Condensed" size="4"> 
                            Lorem ipsum dolor sit amet, his no postulant liberavisse. At nibh lucilius sed. Omnium latine efficiendi ea vis. Elit facilisis mel et. Eu qui erat tation elaboraret. Ut nec tamquam vocibus urbanitas, euripidis contentiones usu ex, luptatum maiestatis mea cu.

                            Iriure accommodare vim et. Sed alia munere pertinax no. Duo eu sumo possim, nam te omnis offendit, no scaevola oportere his. Ut qui dolor scripserit reprehendunt. Ne sea zril vivendo, duo iudico aliquam laoreet eu, cu nullam essent delectus ius.

                            Pri facer accusam omittam eu, eam id dico prompta recusabo. Vix an suas alia putent, quo utinam deleniti legendos ne. Vis et nibh fugit aliquam. Ex est salutandi interesset, soluta ancillae incorrupte sea ne. Qui id velit dicunt interpretaris, ad option blandit nam. Odio mucius adversarium has at. Duo option intellegebat signiferumque ex, ut oblique detraxit sit.
                            </font>
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <br/>

            <!-- JavaScript fajl -->
            <script src="js/jquery.min.js"></script>
            <!-- Kompresovan JavaScript fajl -->
            <script src="js/bootstrap.min.js"></script>
    </body>
</html>

在此按A分组,找到组中的序列并连接序列+ 1

library(dplyr)
data %>% 
        group_by(A) %>% 
        mutate(LABEL=paste(seq_along(A),seq_along(A)+1,sep="-"))

答案 2 :(得分:3)

另一种选择是使用base R ave函数

data$LABEL <- ave(data$A, data$A, FUN = function(x) 
                                      paste0(seq_along(x), "-", seq_along(x)+1))
data
#   A  B LABEL 
#1  1 1A   1-2
#2  1 1B   2-3
#3  1 1C   3-4
#4  2 2A   1-2
#5  2 2B   2-3
#6  3 3A   1-2
#7  3 3B   2-3
#8  3 3C   3-4
#9  3 3D   4-5
#10 3 3E   5-6