包含作为同一数据帧的列提取的列表的数据框列

时间:2018-05-18 13:18:36

标签: r dplyr

我有一个包含3列的数据框。其中一列(第二列)包含每个单元格的值列表。这里 dput 示例数据:

   df <- structure(list(column1 = c("HEATER", "COOLER"), column2 = list(structure(list(
        insidelist = structure(list(es = list("1"), en = list("00"), la = list(
            "01")), .Names = c("es", "en", "la"))), .Names = "insidelist"), 
        structure(list(insidelist = structure(list(es = list("1"), en = list(
            "01"), la = list("01")), .Names = c("es", "en", "la"))), .Names = "insidelist")), 
        column3 = c("88", "31")), .Names = c("column1", "column2", "column3"
    ), row.names = c(NA, -2L), class = "data.frame")

给予这个df:

  column1   column2     column3
1  HEATER   1, 00, 01      88
2  COOLER   1, 01, 01      31

如何从第二列获取值列表作为原始数据帧的列?

期望的输出:

  column1   column2 Column3 column4 column5
1  HEATER     1       00       01      88
2  COOLER     1       01       01      31

3 个答案:

答案 0 :(得分:1)

我们可以做到

<?php
include_once 'db_connect.php';
?>


<!DOCTYPE HTML>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../../../favicon.ico">

    <title>Profile page </title>

 <?php
$con=mysqli_connect("localhost","Username","password","database");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SELECT `FirstName`,`Surname`,`Email`,`Username`,`Date_Creation`FROM Users ");



while($row = mysqli_fetch_array($result))
{



        echo "<br />Your <b><i>Profile</i></b> is as follows:<br />";
        echo "<b>First name:</b> ". $row['FirstName'];
        echo "<br /><b>Last name:</b> ".$row['Surname'];
        echo "<br /><b>Email:</b> ".$row['Email'];
        echo "<br /><b>Year:</b> ".$row['Username'];
        echo "<br /><b>Date created :</b> ".$row['Date_Creation'];
}


mysqli_close($con);
?>
    </main>



</html>

答案 1 :(得分:1)

不要误会我的意思,我喜欢这里和每个人一样多做事的方式,而且很多人都在学习R编程,这是因为它更容易走路,但我觉得有时当你有锤子一切看起来像钉子

Tidyverse有许多优点,但也存在一些缺点,其中一个似乎掩盖/隐藏了R语言的基础知识。 在这种情况下,最强大且“人类可读”的解决方案(imho)是以可读的方式混合方法。

我们来看看。 首先,我们摆脱嵌套列表将它们转换为数据框:

df$column2 <- data.frame(matrix(unlist(df$column2), nrow=nrow(df), byrow=T))

> df
  column1 column2.X1 column2.X2 column2.X3 column3
1  HEATER          1         00         01      88
2  COOLER          1         01         01      31

然后提取内部数据框(column2)并将其与原始df:

并排放置
df <- cbind(select(df,-column2), df$column2)

选择/重命名列是一项微不足道的任务。这里是绑定后的一个例子:

df <- cbind(df, df$column2) %>%
      select(Column1=1, Column2=4, Column3=5, Column4=6, Column5=3)

这为我们提供了所需的输出:

> df

  Column1 Column2 Column3 Column4 Column5
1  HEATER       1    00      01      88
2  COOLER       1    01      01      31

陷入整洁的代码有时会以一种不那么整洁的解决方案结束。我知道很多人都是以这种方式学习R,但是明智的程序员应该警惕这可能导致的黑暗地方,如果你急于解决所有不考虑基础R的问题。

答案 2 :(得分:0)

这是我的目标 - 不像akrun和AntoniosK那样简洁,但可能更具可读性:

df %>% 
  unnest(column2) %>% 
  mutate(lengths = map_int(column2, ~ length(unlist(.x))),
         column2 = map_chr(column2, ~ glue::collapse(unlist(.x), sep = ',') )) %>% 
  separate(column2, sep = ',', into = paste('temp', seq(1,max(.$lengths)), sep = '_')) %>%
  select(column1, starts_with('temp'), column3) %>%
  setNames(paste0("column", 1:ncol(.)))

只是一个注释 - 看起来评论中的答案运行得更快一些,所以如果你正在使用一个大型数据集 - 那么与它们合作可能是明智的。