如何将一个数据框缩减为单行向量?

4

我有这个数据框

  email       date      user_ipaddress       other data    
1 x@bla.com 2020-03-24  177.95.75.230         xxxx
2 x@bla.com 2020-04-02  177.139.49.93         yyyy
3 x@bla.com 2020-04-02  177.139.49.93         zzzz

我希望将这些数据转换为它将被存储的形式。

整个问题就是一个包含不同电子邮件的大型数据框架,我想将每个电子邮件的所有数据减少到一行中,如下所示。

  email       date      user_ipaddress                       other data    
1 x@bla.com 2020-04-02  c('177.95.75.230','177.139.49.93')   c('xxxx','yyyy','zzzz') 

实际上,如果有人能够帮我处理只有一个电子邮件地址的情况,那将拯救我的生命,但随意帮助解决整个问题。

使用

ipadreessVec<-Reduce(append,x =df$network_userid) 

我可以获得我的向量c('177.95.75.230','177.139.49.93'),但如果我尝试进行组合

newdf$network_userid<-a

我明白了。

Error in `$<-.data.frame`(`*tmp*`, network_userid, value = c("20562206-f557-48a3-861b-5d1e18524bbb",  : 
  replacement has 3 rows, data has 1

任何能让我进一步了解问题的回答,即使它不能解决所有问题,也会得到批准。

我不确定这是否是一个非常困难的问题,因为我在不到一小时内得到了4个出色的答案!或者可能是那些曾经遇到过这个问题的人遭受了很多痛苦,以至于他们会永远记得如何解决。 - fils capo
4个回答

3
library('data.table')

通过电子邮件和日期:
setDT(df)[, .(user_ipaddress = paste0(user_ipaddress, collapse = ","),
              other = paste0(other_data, collapse = ",")), by = .(email, date)]

#       email       date              user_ipaddress     other
# 1: x@bla.com 2020-03-24               177.95.75.230      xxxx
# 2: x@bla.com 2020-04-02 177.139.49.93,177.139.49.93 yyyy,zzzz

仅通过电子邮件方式:

setDT(df)[, .(date = paste0(date, collapse = ","),
              user_ipaddress = paste0(user_ipaddress, collapse = ","),
              other = paste0(other_data, collapse = ",")), by = .(email)]

#        email                             date                            user_ipaddress          other
# 1: x@bla.com 2020-03-24,2020-04-02,2020-04-02 177.95.75.230,177.139.49.93,177.139.49.93 xxxx,yyyy,zzzz

数据:

df <- read.table(text='email       date      user_ipaddress       other_data    
1 x@bla.com 2020-03-24  177.95.75.230         xxxx
                 2 x@bla.com 2020-04-02  177.139.49.93         yyyy
                 3 x@bla.com 2020-04-02  177.139.49.93         zzzz', header = TRUE, stringsAsFactors = FALSE)

3
我可能误解了你的意思,更有可能是你想要像@akrun展示的那样的东西,但如果按照字面意思来理解,你可能希望使用来实现:
as.data.frame(lapply(df, function(x) capture.output(dput(unique(x)))))
#>         email                          date                      user_ipaddress
#> 1 "x@bla.com" c("2020-03-24", "2020-04-02") c("177.95.75.230", "177.139.49.93")
#>                       other
#> 1 c("xxxx", "yyyy", "zzzz")


这是无瑕的。 - fils capo

2
我们可以创建一个按'email'和'date'分组的list列。
library(dplyr)
DF %>% 
    group_by(email, date) %>%
    summarise_all(list)
# A tibble: 2 x 4
# Groups:   email [1]
#  email     date       user_ipaddress otherdata
#  <chr>     <chr>      <list>         <list>   
#1 x@bla.com 2020-03-24 <chr [1]>      <chr [1]>
#2 x@bla.com 2020-04-02 <chr [2]>      <chr [2]>

或者在 devel 版本中使用 acrosssummarise
DF %>%
   group_by(email, date) %>% 
   summarise(across(everything(), list))
# A tibble: 2 x 4
# Groups:   email [1]
#  email     date       user_ipaddress otherdata
#  <chr>     <chr>      <list>         <list>   
#1 x@bla.com 2020-03-24 <chr [1]>      <chr [1]>
#2 x@bla.com 2020-04-02 <chr [2]>      <chr [2]>

数据

DF <- structure(list(email = c("x@bla.com", "x@bla.com", "x@bla.com"
), date = c("2020-03-24", "2020-04-02", "2020-04-02"),
 user_ipaddress = c("177.95.75.230", 
"177.139.49.93", "177.139.49.93"),
otherdata = c("xxxx", "yyyy", 
"zzzz")), class = "data.frame", row.names = c("1", "2", "3"))

DF %>% 按(email, date)分组 %>% 汇总(across(everything(), list)) across函数未找到DF %>% 按(email, date)分组 %>% 汇总_all(list) 期望一个单侧公式、一个函数或一个函数名。 调用 rlang::last_error() 查看回溯信息。 - fils capo
@filscapo 它是开发版本。 - akrun
@filscapo,summarise_all有什么问题? - akrun

1
也许你可以尝试在基本R中使用aggregate
dfout <- aggregate(.~email,df,FUN = function(x) list(unique(levels(x))))

such that

> dfout
      email                   date               user_ipaddress       other data
1 x@bla.com 2020-03-24, 2020-04-02 177.139.49.93, 177.95.75.230 xxxx, yyyy, zzzz

数据

df <-  structure(list(email = c("x@bla.com", "x@bla.com", "x@bla.com"
), date = c("2020-03-24", "2020-04-02", "2020-04-02"), user_ipaddress = c("177.95.75.230", 
"177.139.49.93", "177.139.49.93"), `other data` = c("xxxx", "yyyy", 
"zzzz")), class = "data.frame", row.names = c(NA, -3L))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接