刚刚在这里创建了一个帐户,因为我终于有了一个值得问的问题。我是R的新手(1年,开关用户),但通常能够在线找到我的R问题的答案。我的问题有点令人费解,所以我会尽量保持清醒。如果我的术语不重要,请道歉。
我有一个包含两列的数据框,一个旧ID号和两个保护功能名称。 E.g:
> df =
> code attr
> 1 FSM Oceanic atoll
> 3 FSM Oceanic bank
> 1 Palau Oceanic atoll
> 3 Palau Oceanic bank
正如您所看到的,这些功能是独一无二的,但不是旧编码系统。我需要使用新的唯一ID代码创建一个新列。例如:
> df =
> code attr new.code
> 1 FSM Oceanic atoll 1
> 3 FSM Oceanic Bank 2
> 1 Palau Oceanic atoll 3
> 3 Palau Oceanic Bank 4
我从上一个问题中找到了一种方法:
> newCodes <- function(argtype, argaction){
> if (argtype==1 & argaction=="FSM Oceanic atoll")
> return(1)
> if (argtype==3 & argaction=="FSM Oceanic Bank")
> return(2)
> if (argtype==1 & argaction=="Palau Oceanic atoll")
> return(3)
> if (argtype==3 & argaction=="Palau Oceanic Bank")
> return(4)
> } # Defines my function
>
> df$new.code <- mapply(newCodes, df$code, df$attr) # Creates the new conditional column
它需要以这种方式完成的原因是因为我的原始数据帧有许多相同“独特功能”的重复条目,需要为我的目的进行维护(它本质上是shapefile的属性表,因此重复的条目)。
当我只有一些功能(如10)时,上面的功能代码很棒,但在某些时候我需要为具有多达185个独特功能的表格执行此操作。我想知道是否可以循环上面的函数,这样我就不必为每个功能手动输入单独的“argtypes”和“argactions”?我觉得可能有一种方法可以根据我得到的初始数据帧帧(即我给出的第一个数据帧)循环这个。我不知道它在代码中会是什么样子但是意味着什么:
> if (argtype == [loop: through each old code number row by row in the initial "code"
> column in 1st df] & argaction == [loop: through each corresponding attribute name row
> by row in the initial "attr" column in 1st df])
> return([loop: just loop through each row value of a df with the new code IDs,
> which would be just 1 to x, x being number of new ID codes needed])
真的希望我的意思很清楚。感谢您对此提出的任何建议。
答案 0 :(得分:0)
transform(df, new.code=as.numeric(factor(attr)))
这为attr中的每个唯一术语提供了一个数字,编号是按字母顺序排列的。它使用的事实是,如果将因子转换为数字,它会给出一个指向因子水平的整数。我希望这有帮助。 干杯