将列表转换为一组数据帧

时间:2018-10-25 19:54:12

标签: r dataframe

我问了一个问题here。我在这里进行后续操作,因为它可能作为一个独立的问题很有用。我有以下最小示例R代码:

Name <- c("John", "Jane", "Arthur", "Maggie","Harry", "Will")
Age <- c(20, 30, 31, 33, 30, 20)
City <- c("London", "Paris", "New York", "Delhi", "London", "Paris")

main_df <- data.frame(Name, Age, City)

split_df <- split(main_df, City)

在真实数据中,我需要在一列中对文本进行很多复杂的regex操作,但是该操作根据split()函数产生的列表元素的不同而不同。因此,在此示例中,每个regex中的所有元素都需要相同的City操作。

我熟悉数据框架,所以我的问题是如何将列表的每个元素转换为数据框架以进行单独操作,然后再次组合。优选地,以分类的名称命名的每个数据帧用于例如分割。在我的示例中为City

欢迎其他任何想法。我注意到通常不建议拆分为单独的数据帧!

1 个答案:

答案 0 :(得分:1)

您的每个列表元素已经是data.frame

> lapply(split_df, class)
$Delhi
[1] "data.frame"

$London
[1] "data.frame"

$`New York`
[1] "data.frame"

$Paris
[1] "data.frame"

使用lapply()根据条件将函数应用于data.frame的子集

这是一个愚蠢的功能,它添加了一个基于城市名称命名的新列:

my_fun <- function(x){
  if(as.character(unique(x$City)) == "Paris"){
    x$woo = "yay"
  }
  if(as.character(unique(x$City))  == "New York"){
    x$woo = "woo"
  }
  if(as.character(unique(x$City))  == "London"){
    x$woo = "yippee"
  }
  if(as.character(unique(x$City))  == "Delhi"){
    x$woo = "alrightttt"
  }

  return(x)
}

> split_df <- lapply(split_df, my_fun)
> split_df
$Delhi
    Name Age  City        woo
4 Maggie  33 Delhi alrightttt

$London
   Name Age   City    woo
1  John  20 London yippee
5 Harry  30 London yippee

$`New York`
    Name Age     City woo
3 Arthur  31 New York woo

$Paris
  Name Age  City woo
2 Jane  30 Paris yay
6 Will  20 Paris yay


> split_df <- lapply(split_df, function(x){x$yay = "yay"; return(x)})
> split_df

$Delhi
    Name Age  City yay
4 Maggie  33 Delhi yay

$London
   Name Age   City yay
1  John  20 London yay
5 Harry  30 London yay

$`New York`
    Name Age     City yay
3 Arthur  31 New York yay

$Paris
  Name Age  City yay
2 Jane  30 Paris yay
6 Will  20 Paris yay

使用do.call()rbind.data.frame()将您的data.frame列表绑定到一个data.frame

> do.call(rbind.data.frame, split_df)
           Name Age     City        woo
Delhi    Maggie  33    Delhi alrightttt
London.1   John  20   London     yippee
London.5  Harry  30   London     yippee
New York Arthur  31 New York        woo
Paris.2    Jane  30    Paris        yay
Paris.6    Will  20    Paris        yay