【问题标题】:How to assign the value of a vector to a data frame?如何将向量的值分配给数据框?
【发布时间】:2015-02-09 13:47:34
【问题描述】:

我目前有一个 ID 向量作为因素。我有一个 for 循环,用于检查数据框中的这些 ID 并返回一个特定值。我正在创建一个数据框,它在第 1 列中存储当前通过循环运行的 ID,在第二列中存储感兴趣的值。

我遇到的问题是在将 ith ID 分配给我的数据框时,它返回的是因子的索引号而不是值。见代码。

ref <- unique(yearsd[,11]) # yearsd df has customer records; i'm extracting unique IDs
counter <- data.frame(matrix(ncol = 2, nrow = length(ref))) # initialize counter for for loop

for(i in 1:length(ref))
{
  loc <- which(ref[i] == yearsd[,11]) # returns positions of IDs
  yearTF <- unique(yearsd[loc,3])     # gives me a vector of years that ID shows up
  counter[i,1] = print(ref[i])        # store the ID currently in the loop
  counter[i,2] = length(yearTF)       # store the number of years the show up in the records
}

如果refith元素是ABCD并且是因子的第32级,我的counter[i,1]值结束最多是 32 而不是 ABCD。我也试过print(ref[i]),但也没有运气。我总是得到因子的级别索引号。

如果我把它改成字符会更好吗?它们是字母数字字符串。

编辑

  • yearsd 是带有客户记录的 df
  • yearsd[,11] 包含客户 ID
  • 对于每条记录,都有一个交易日期,它只存储 年,例如2005 年、2006 年等。

我正在尝试通过 yearsd 来获得一个 df,其中在一列中包含这些客户 ID,并在第二列中计算他们有多少年的交易/

Example Output:

CustID   YearsIn
A0001    3
D504     1
RR45Y    2

意思是客户 A0001 有 3 个不同年份的交易,D504 有 1 个不同年份的交易,而 RR45Y 有 2 个不同年份的交易。每个客户一年内可能有多次交易。我只关心他们是否至少有 1 个;如果是这样,我会为那个客户计算那一年。

如果您有任何问题,请告诉我。感谢您的帮助。

【问题讨论】:

  • 我认为你的计数器是一个数字矩阵。这就是为什么它无法在其中保存角色的原因。尝试保存在列表中,然后转换为数据框。
  • 完整的reproducible example 在这里会有所帮助。目前还不清楚所涉及的所有对象的确切数据类型。我不确定您从作业中“返回值”的位置。
  • 所以你只是想计算每年出现的次数?您可能应该为此使用table(yearsd[,11])。但是由于yearsd 仍然没有在这里定义,所以我不清楚它的确切结构,所以它仍然无法重现。但我认为你应该在这里使用table()aggregate() 或其他一些更像R 的函数。提供样本输入和所需的输出。
  • @koundy 我按照stackoverflow.com/questions/12613909/… 中的建议对计数器进行了单元测试,其中 counter[,1] 是字符。它仍然存储第 i 级索引值。
  • @MrFlick 我试图计算一个 ID 出现了多少年。一个 ID 可能在 2011 年出现 3 次,在 2012 年出现 4 次。因此,计数将是 2。将添加另一个编辑以明确。

标签: r


【解决方案1】:

改用aggregate 怎么样(因为这是您真正想要解决的问题。)

#sample data
dd<-data.frame(
    cust=rep(c("A001", "D504","RR457"), c(3,1,2)),
    year = c(2001:2003, 2002, 2003:2004)
)

aggregate(year~cust, dd, function(x) length(unique(x)))

#    cust year
# 1  A001    3
# 2  D504    1
# 3 RR457    2

但是再回到您的问题上,您不能真正以这种方式初始化 data.frame。当你设置它没有行时,它会选择最简单的数据类型(一个空的逻辑向量)。如果你想预先填充 data.frame,一个更好的策略会是

ref <- unique(dd$cust)
counter <- data.frame(id=factor(NA,levels=ref), 
    count=numeric(length(ref)), stringsAsFactors=F) 

for(i in 1:length(ref)) {
  loc <- which(ref[i] == dd$cust)
  yearTF <- unique(dd[loc,"year"])
  counter[i,1] <- ref[i]
  counter[i,2] <- length(yearTF)
}
counter

甚至只是做

counter[i,1] <- as.character(ref[i])

会强制转换为字符(print() 不会这样做)。

【讨论】:

  • 谢谢!正是我试图获得的结果并欣赏初始化技巧。
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 2016-05-20
  • 2015-04-07
  • 2022-11-23
  • 2020-04-09
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多