我有一个包含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
答案 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(.)))
只是一个注释 - 看起来评论中的答案运行得更快一些,所以如果你正在使用一个大型数据集 - 那么与它们合作可能是明智的。