看来这应该是微不足道的,但我无法使其正常工作,这使我发疯。我有一个包含几列的数据表,其中包括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"
dtStates[,1]
仍然是data.table
带有1列的列,被视为for
循环中的1个对象,因此所有值都一起打印出来,您需要将这些值转换为向量。
一种简单的方法是使用[[
。
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句