【问题标题】:Recode each element in an array list variable using for loop in R使用 R 中的 for 循环重新编码数组列表变量中的每个元素
【发布时间】:2023-03-20 15:15:01
【问题描述】:

我是 R 新手,我一直坚持这一点。我在下面有一个数据集,其中我创建了一个名为“amountOfTxn_array”的新数组列表变量,其中包含按顺序排列的三个数值。这些是从一月到三月的交易量。我的目标是从这个数组列表中创建新变量,迭代“amountOfTxn_array”中的每个数据元素。

> head(myData_05_Array)
Index   accountID   amountOfTxn_array
1:00    8887    c(36.44, 75.00,185.24)
2:00    13462   c(639.45,656.10,237.00)
3:00    47249   c(0,  24, 2012)
4:00    49528   c(1189.20,2326.26,1695.89)
5:00    57201   c(24.67, 0.00, 0.00)
6:00    57206   c(0.00, 661.98,2957.68)

str(myData_05_Array) “data.table”和“data.frame”类:3176 obs。 4个变量: $ accountID : int 8887 13462 47249 49528 57201 57206 58522 79073 80465 81032 ... $ amountOfTxn_200501:数字 36.4 639.5 0 1189.2 24.7 ... $ amountOfTxn_200502: 数字 75 656 24 2326 0 ... $ amountOfTxn_200503: 数字 185 237 2012 1696 0 ... $ amountOfTxn_array :3176 的列表

此外,下面提供了一个用于创建新变量的示例代码,其中如果数组中的值大于 100,我想标记 1,否则标记 0。当我运行示例代码时,我得到“错误:(列表)对象不能被强制输入‘双’错误。我可以要求解决这个问题。我非常感谢任何回应。 谢谢!

> for(i in 1:3)
+ {  
+   if(myData_05_Array$amountOfTxn_array[i] > 100){
+     myData_05_Array$testArray[i] <- 1
+   }
+   else{
+     myData_05_Array$testArray[i] <- 0
+   }
+ }

错误:(列表)对象不能被强制输入'double'

我期望的输出如下: amountOfTxn_testArray c(0, 0, 1) c(1, 1, 1) c(0, 0, 0) c(1, 1, 1) c(0, 0, 0) c(0, 1, 1)

【问题讨论】:

  • 我认为有一个问题,因为myData_05_Array$amountOfTxn_array[i] 你取了amoutOfTxn_array 的第 i 行/条目,这是一个向量,在这种情况下,你将一个向量与100 进行比较这会引发错误。也许您将此列拆分为 3 并比较每个元素
  • 你能显示str(myData_05_Array)的输出吗?
  • 另外,一般情况下,您可以使用any() 来检查其中的条件,例如vector: any(c(1:10) &gt;5),因此您不必使用循环。
  • @wolf_wue 实际上,amoutOfTxn_array 是从代表 Jan、Feb 和 Mar 的 3 个原始列创建的。实际上,我的数据集中有 24 个列代表两年的每月数据。对 24 列进行计算非常麻烦,这就是为什么我正在探索其他选项,例如将这 24 列合并为一列作为数字列表。在这里,我只探索 3 个月的数据。我尝试通过索引值获取第 3 位和第 2 位之间的差异,它工作正常。接下来我想做的是对每个数据元素做一些逻辑操作。
  • 嗨@JannaMaas,请看上面打印出来的str(myData_05_Array)。

标签: arrays r list loops for-loop


【解决方案1】:

“做24列的计算很麻烦”

哈哈!欢迎来到dplyr 世界:

library(dplyr)
#generate dummy data
dummyDf <-read.table(text='Index   accountID   Jan Feb March
1:00    8887    36.44 75.00 185.24
2:00    13462   639.45 656.10 237.00
3:00    47249   0 24 2012
4:00    49528   1189.20 2326.26 1695.89
5:00    57201   24.67 0.00 0.00
6:00    57206   0.00 661.98 2957.68', header=TRUE, stringsAsFactors=FALSE) 

逐列索引变化

#the dot (.) argument refers to the focal column

df %>% mutate_at(3:5, funs(as.numeric(.>100)))

按预定义名称改变列

changeVars =c("Jan","Feb","March")
df %>% mutate_at(.cols=changeVars, funs(as.numeric(.>100)))

如果满足某些条件则改变列

df %>%mutate_if(is.double,  funs(as.numeric(.>100)))

输出:

 Index accountID Jan Feb March
1  1:00      8887   0   0     1
2  2:00     13462   1   1     1
3  3:00     47249   0   0     1
4  4:00     49528   1   1     1
5  5:00     57201   0   0     0
6  6:00     57206   0   1     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    相关资源
    最近更新 更多