1

很抱歉,很长的帖子。

尽管我设法使用 for 循环克服了这个问题,但我感觉 sqldf 会更有效,但到目前为止我还不能做到这一点。

我的第一个数据框有一个唯一标识符(名称)。它有点像 1000x5,但本着这样的精神:

Name <- c('Ben','Gary','John','Michael')
Age  <- c(13,20,5,57)
dfA  <- as.data.frame(cbind(Name,Age))

dfA
>        Name Age
>   1     Ben  13
>   2    Gary  20
>   3    John   5
>   4 Michael  57

我的第二个数据框没有唯一键,也是 5000x5,但通常看起来像这样:

Name   <- c('Ben','Ben','Ben','Gary','Michael','Michael','Michael')
Color  <- c('Blue','Red','Green','Red','Yellow','Yellow','Black')
Other.Entries <- c('180','200','150','100','70','200','130')
dfB   <- as.data.frame(cbind(Name,Color))

dfB
>     Name  Color  Other_Entries(not.related)
>1     Ben   Blue   180
>2     Ben    Red   180
>3     Ben  Green   150
>4    Gary    Red   100
>5 Michael Yellow   70
>6 Michael Yellow   200
>7 Michael  Black   130

请注意,每个名称的颜色都有冗余,并且并非所有名称都会出现。

我想要的输出是:

  1. 检索数据框 B 中每个名称的颜色(删除多余的,可能按字母顺序)

  2. 将这几种颜色转换为字符串(例如使用函数“toString”)

  3. 将字符串添加为第一个数据框中的新条目

起初,当我使用 for 循环时,我创建了一个带有这样的空列的新数据框

dfCombined <- dfA
dfCombined["Color"] <- NA

.. 并遍历所有行,从第二个数据帧进行查询。

但也许这可能没有必要使用一些聪明的东西。

最终结果应该是:

dfCombined
>     Name Age    Color
>1     Ben  13   Blue, Green, Red
>2    Gary  20   Red
>3    John   5
>4 Michael  57   Black, Yellow

有什么建议么?

4

2 回答 2

2

1a) 带有多个语句的 sqldf试试这个:

library(sqldf)

dfB_s <- sqldf("select distinct * from dfB order by Name, Color")
dfB_g <- sqldf("select Name, group_concat(Color) Color 
                from  dfB_s
                group by Name")
sqldf("select * 
       from dfA 
       left join dfB_g using (Name)")

1b) 带有一条语句或多合一语句的 sqldf

sqldf("select * 
       from dfA
       left join
             (select Name, group_concat(Color) Color 
             from 
                 (select distinct * from dfB order by Name, Color)
             group by Name)
       using (Name)")

这些中的任何一个都给出:

     Name Age          Color
1     Ben  13 Blue,Green,Red
2    Gary  20            Red
3    John   5           <NA>
4 Michael  57   Black,Yellow

2)没有包没有sqldf,它会这样做:

dfB_s <- unique(dfB)[order(dfB$Name, dfB$Color), ]
dfB_g <- aggregate(Color ~ Name, dfB_s, toString)
merge(dfA, dfB_g, all.x = TRUE, by = "Name")

3) data.table如果速度是问题,您可能想尝试 data.table:

library(data.table)

unique(data.table(dfB, key = "Name,Color"))[
           , toString(Color), by = Name][
           data.table(dfA)]

给予:

      Name               V1 Age
1:     Ben Blue, Green, Red  13
2:    Gary              Red  20
3:    John               NA   5
4: Michael    Black, Yellow  57

4)dplyr,这是一个 dplyr 解决方案:

图书馆(dplyr)

dfA %.% 
   left_join(dfB %.%
                 unique() %.%
                 arrange(Name, Color) %.% 
                 group_by(Name) %.% 
                 summarise(Color = toString(Color)))

添加了其他解决方案。修正了一些错误。

于 2014-05-05T14:20:41.333 回答
0

要进行批处理,它会在实际代码中执行此操作。伪代码:为颜色数组加载数组变量拉取名称运行while循环:$array = array("foo", "bar", "hello", "world"); var_dump($array); 为每个名称运行插入新表。

于 2014-05-05T00:14:11.650 回答