替换列表的分组元素

时间:2018-06-16 08:45:24

标签: r

我在data.frame中有一个列,其中包含重复的元素:

 7     
 7    
 7     
 7     
 7   
 b
 b
 b        
 c
 c
 c
 c
 c

我不知道哪些是重复的元素,因为data.frame是以前计算的结果。例如:重复元素在这种情况下可以是3(即7,b,c)或4在其他情况下或2等等,它们也可以是不同的(即4,a,f或10,s, 3)。我想用一系列颜色替换重复的元素。例如,在这种情况下:

 blue     
 blue    
 blue     
 blue     
 blue   
 yellow
 yellow
 yellow        
 red
 red
 red
 red
 red

或者如果列表仅由两个重复的组组成,则组的元素将分别分配为蓝色和黄色。这可能吗? 我能够替换列表的元素,但是当我不知道data.frame中有多少组而不打印它并将其表格时,我就能够。

有人可以帮我吗?

提前谢谢

4 个答案:

答案 0 :(得分:2)

我们可以使用因素:

数据

template is_member_of(alias M)
{
    alias T = /**/;
}

static assert(is(is_member_of!(S.func) == S));
static assert(is(is_member_of!func == void));
static assert(is(is_member_of!(S.x) == S));

<强>溶液

df <- data.frame(col1=c('7','7','7','7','7','b','b','b','c','c','c','c','c'),stringsAsFactors = F)
repl<- c("blue","yellow","red","purple")

答案 1 :(得分:0)

<!DOCTYPE html>
<html>
<head>

    <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link rel="stylesheet" href="//code.jquery.com/mobile/1.5.0-alpha.1/jquery.mobile-1.5.0-alpha.1.min.css">

    <script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
    <script src="//code.jquery.com/mobile/1.5.0-alpha.1/jquery.mobile-1.5.0-alpha.1.min.js"></script>
</head>
<body>
<script>

    $("#dsa").bind("tap",qq);
    function qq(event){
        $(event.target).css("background-color","#F0F");
        }
    </script>
    <div data-role="page" data-title="Tableau測試" data-theme="b">
        <div data-role="header">
        <p>從下方選單選擇一個想看的東西</P>
        </div>
        <div data-role="content">
            <ol data-role="listview">
                <li><a href="20180615-0001.html" rel="external">20180615-0001</a></li>
                <li><a href="test.html" rel="external">test</a></li>
                <div><p id="dsa" style="background-color:#0F6">fnhdjiahgdifsaghui</p></div>
            </ol>
        </div>
        <div data-role="footer" id="foo">
        <p></P>
        </div>
    </div>
</body>

答案 2 :(得分:0)

我认为这可能有助于您的需求。

 recode(x, "'7'='blue'; 'b'='yellow'; 'c'='red'")

答案 3 :(得分:0)

可以同时使用dplyr包和data.table::rleid函数来获得适用于dplyr-chain的解决方案。

假设应包含最大可能颜色数的首选项颜色矢量为:

myColor = c("blue", "yellow", "red", "black", "pink")

否则,甚至可以使用colors(distinct = TRUE)代替myColor

选项#1:解决方案可以实现为:

library(dplyr)
library(data.table)

df %>% mutate(Color = myColor[rleid(Col)])

#OR -- If someone doesnt want to use `data.table` then solution can be as
df %>% mutate(Color = myColor[cumsum(Col != lag(Col, default = ""))])

#    Col  Color
# 1    7   blue
# 2    7   blue
# 3    7   blue
# 4    7   blue
# 5    7   blue
# 6    b yellow
# 7    b yellow
# 8    b yellow
# 9    c    red
# 10   c    red
# 11   c    red
# 12   c    red
# 13   c    red

选项#2:使用colors(distinct = TRUE)

df %>% mutate(Color = colors(distinct = TRUE)[cumsum(Col != lag(Col, default = ""))])
#    Col        Color
# 1    7        white
# 2    7        white
# 3    7        white
# 4    7        white
# 5    7        white
# 6    b    aliceblue
# 7    b    aliceblue
# 8    b    aliceblue
# 9    c antiquewhite
# 10   c antiquewhite
# 11   c antiquewhite
# 12   c antiquewhite
# 13   c antiquewhite

数据:

df <- read.table(text = 
"Col                   
7     
7    
7     
7     
7   
b
b
b        
c
c
c
c
c",
stringsAsFactors = FALSE, header = TRUE)