【问题标题】:How to create columns from values in R? [duplicate]如何从 R 中的值创建列? [复制]
【发布时间】:2017-10-03 23:32:39
【问题描述】:

我有一个这样的数据框:

             X1                   X2
1     Country                  Spain
2        Year                   2016
3       Value                  34.56
4     Country                  Italy
5        Year                   2016
6       Value                  48.21
7     Country                    USA
8        Year                   2016
9       Value                  84.37
10     Country                France
11       Year                   2016
12      Value                  18.94

等等。

X1 和 X2 是列。我从一个网站上抓取了这些数据,但我想要这个:

Country    Year    Value
Spain      2016    34.56
Italy      2016    48.21
USA        2016    84.37
France     2016    18.94

我尝试了 gather() 函数,但失败了。非常感谢任何帮助。

【问题讨论】:

  • 这是一个重复的问题,但我目前找不到好的帖子。最简单的方法是unstack(dat, X2~X1)。其中 dat 是您的 data.frame 的名称。请注意,新列是因子,因此您必须遍历它们并将相关的列转换为数字。类似newDat[2:3] <- lapply(newDat[2:3], as.numeric)

标签: r dataframe rows


【解决方案1】:

试试:

output <- data.frame(t(matrix(data$X2,3)))
colnames(output) <- c("Country", "Year", "Value")

如果您的长度可变,但“国家/地区”始终位于新“信息块”的第一行,请尝试:

library(data.table) # because i dont like data.frame
library(zoo) # for na.locf (last observation carried forward)
dt <- data.table(df)
dt[X1 == "Country", X3 := 1:length(X1 == "Country")]
dt[, X3 := na.locf(X3)]
dt
dcast(dt, X3 ~ X1)

本质上,这会创建一个 ID 列 (X3),您可以使用它来将表格从长格式转换为宽格式。

【讨论】:

  • 我的错误是我没有提到这个数据是混乱的。我在 X1 中有这样的东西:国家、年份、价值、国家、年份、价值、国家、价值、国家、年份、价值、GDP、国家、年份、价值等。
  • 也考虑到这一点。如果数据是完整的(即没有缺失值)并且没有混合(即一个国家 A 的值跟随在三个其他国家的值之后,在这种情况下显然是不可能的),您可以尝试先按 X1 对数据框进行排序,然后做类似上面的事情。
  • 我将原来的答案调整为更通用。
【解决方案2】:

如果您当前的数据框被称为df,那么这应该可以解决问题:

Country <- df$X2[df$X1 == "Country"]
Value <- df$X2[df$X1 == "Value"]
Year <- df$X2[df$X1 == "Year"]

df_new <- data.frame(Country, Year, Value)

【讨论】:

  • 这对我很有帮助,谢谢,但我还有另一个问题。我有一些缺失的数据,不是 NA,而是空值,比如有一个 Country:Syria,Year:2016 和 Value:nothing,它是空的。如何使用您的方法制作数据框?
  • 我认为数据框不能包含空值(所有列的行号必须相同)。也许它不是空的,而只是一个空格?还是您所说的数据尚未导入,您无法将其放入数据框中?
猜你喜欢
  • 2023-03-21
  • 2016-09-07
  • 1970-01-01
  • 2016-10-02
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
相关资源
最近更新 更多