R 从数据表创建列表,然后在循环中使用它

R 从数据表创建列表,然后在循环中使用它,r,list,loops,R,List,Loops,这看起来应该很琐碎,但我无法让它工作,这让我发疯。我有一个包含多个列的数据表,包括sGEOID,地理id。我想提取sGEOID的唯一值列表,然后使用每个值运行一个循环。代码不需要多次运行循环,每次循环变量都使用一个sGEOID值,而只运行一次循环,循环变量使用一个多元素列表值。我发现让循环正常工作的唯一方法是显式地创建列表,而不是从数据表中的值中提取列表,这对于工作版本来说是不可行的 以下是代码,以及每次尝试的结果: # Create simplified version of data tab

这看起来应该很琐碎,但我无法让它工作,这让我发疯。我有一个包含多个列的数据表,包括sGEOID,地理id。我想提取sGEOID的唯一值列表,然后使用每个值运行一个循环。代码不需要多次运行循环,每次循环变量都使用一个sGEOID值,而只运行一次循环,循环变量使用一个多元素列表值。我发现让循环正常工作的唯一方法是显式地创建列表,而不是从数据表中的值中提取列表,这对于工作版本来说是不可行的

以下是代码,以及每次尝试的结果:

# Create simplified version of data table
dtObs = data.table(
  sGEOID = c("A","B","B",'C'),
  iVal = 1:4
)

print(dtObs)
# result
#   sGEOID iVal
#1: A 1
#2: B 2
#3: B 3
#4: C 4

# Create new data table with unique values of sGEOID
dtStates <- dtObs[, list(iCnt= .N), by = c('sGEOID')][order(sGEOID)]
print(dtStates)
# result
#   sGEOID iCnt
#1: A 1
#2: B 2
#3: C 1

# Loop through values in column of data table dtStates: FAILS
for (lasGEOID in dtStates[,1]) {
  print(lasGEOID)
  print('new line')
}
# result
# "A" "B" "C"
# "new line"

# Extract unique values into list
llsGEOIDs <- dtStates[,c('sGEOID')]
typeof(llsGEOIDs)
# result
#[1] "list"
print(llsGEOIDs)
# result
#   sGEOID
#1: A
#2: B
#3: C

# Loop through elements of list: FAILS
for (lasGEOID in llsGEOIDs) {
  print(lasGEOID)
  print('new line')
}
# result
#[1] "A" "B" "C"
#[1] "new line"

# Create list directly as list
# This is not a viable option for the real code
llsGEOIDs <- list('A','B','C')
print(llsGEOIDs)
# result
#[[1]]
#[1] "A"
#
#[[2]]
#[1] "B"
#
#[[3]]
#[1] "C"
#

# Loop through elements of list: WORKS
for (lasGEOID in llsGEOIDs) {
  #lasGEOID <- '06'
  print(lasGEOID)
  print('new line')
}
# result
#[1] "A"
#[1] "new line"
#[1] "B"
#[1] "new line"
#[1] "C"
#[1] "new line"
#创建数据表的简化版本
dtObs=数据表(
sGEOID=c(“A”、“B”、“B”、“c”),
iVal=1:4
)
打印(dtObs)
#结果
#斯吉奥德伊瓦尔
#1:A 1
#2:B2
#3:B3
#4:C4
#创建具有唯一sGEOID值的新数据表

dtStates
dtStates[,1]
仍然是一个
数据。表
中有一列,在
for
循环中被视为一个对象,因此所有值都打印在一起,您需要将值转换为向量

一个简单的方法是使用
[[

for (lasGEOID in dtStates[[1]]) {
   print(lasGEOID)
   print('new line')
}

#[1] "A"
#[1] "new line"
#[1] "B"
#[1] "new line"
#[1] "C"
#[1] "new line"

一个旁注:
.N
给出了每个
sGEOID
中的行数,如果你想计算唯一值,你可能想使用
uniqueN

谢谢。这就成功了。这就是我对使用llsgeoid的版本所做的,它是一个列表。知道为什么不起作用吗?我尝试了另一个版本,我知道从示例中可以看出,为了保持简单,使用仍然是1列数据帧的
llsGEOIDs@rks13 No创建llsGEOIDs。检查有效性的一个简单技巧是使用
length
length(dtStates[,c('sGEOID'))
长度(dtStates[,c('sGEOID'))
length(dtStates[,c('sGEOID')])是1),
length(dtStates[[1])
是3。