【问题标题】:How to split a list of strings into odd and even elements in R如何将字符串列表拆分为R中的奇数和偶数元素
【发布时间】:2013-04-10 20:22:45
【问题描述】:

抱歉,我连这项任务最基本的部分都失败了。我有一个 50 长的字符串列表,并且我初始化了一个 25 长的空向量,但即使手动将一个的第一个元素分配给另一个的第一个元素也失败了:

> p$key
 [1] CA TX NY FL IL PA OH MI GA NC NJ VA MA WA IN AZ TN MO MD WI MN CO AL SC LA KY OR
[28] OK CT IA MS AR KS UT NV NM WV NE ID ME NH HI RI MT DE SD AK ND VT WY
50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME MI ... WY
> st <- character(25)
> st[1] <- p$key[1]
> st[1]
[1] "5"
> p$key[1]
[1] CA
50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME MI ... WY
>

对不起,我太密集了,你能指出我在这里不知道的地方吗?谢谢 - 教育局

【问题讨论】:

  • 您处理的是因素,而不是角色。首先将p$key 转换为as.character。我仍然不清楚:你的最终目标是什么?

标签: string r list vector initialization


【解决方案1】:

您的p$keyfactor,所以改为st[1] = as.character(p$key[1])

假设您想要字符列表,这将为您提供拆分:

odds = as.character(p$key[seq(1,50,2)])
evens = as.character(p$key[seq(2,50,2)])

【讨论】:

  • 伙计们——非常感谢。天哪,我在 R 上学得真的很慢,我什至没有掌握因素的含义。我正在尽我所能地学习它,但这对我来说是一种范式转变——它不是!谢谢你教我几个新的和强大的东西。两本 R 书籍和一百个网站都没有透露你的答案。再次感谢 - EdB
  • @EdB,请考虑对您认为有帮助的答案进行投票,并接受您认为最能回答您的问题的答案(如果已解决)。这有助于让那些正在回答旧问题的人更容易管理“未回答”的问题队列。谢谢。
【解决方案2】:

试试这个:

> key <- factor(state.abb)
> key
 [1] AL AK AZ AR CA CO CT DE FL GA HI ID IL IN IA KS KY LA ME MD MA MI MN MS MO MT
[27] NE NV NH NJ NM NY NC ND OH OK OR PA RI SC SD TN TX UT VT VA WA WV WI WY
50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME ... WY

如果您想要每个替代值并希望保留所有因子水平,请使用:

> split(key, 1:length(key) %% 2 == 0)
$`FALSE`
 [1] AL AZ CA CT FL HI IL IA KY ME MA MN MO NE NH NM NC OH OR RI SD TX VT WA WI
50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME ... WY

$`TRUE`
 [1] AK AR CO DE GA ID IN KS LA MD MI MS MT NV NJ NY ND OK PA SC TN UT VA WV WY
50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME ... WY

如果您更喜欢将输出作为字符值,请使用:

> split(as.character(key), 1:length(key) %% 2 == 0)
$`FALSE`
 [1] "AL" "AZ" "CA" "CT" "FL" "HI" "IL" "IA" "KY" "ME" "MA" "MN" "MO" "NE" "NH"
[16] "NM" "NC" "OH" "OR" "RI" "SD" "TX" "VT" "WA" "WI"

$`TRUE`
 [1] "AK" "AR" "CO" "DE" "GA" "ID" "IN" "KS" "LA" "MD" "MI" "MS" "MT" "NV" "NJ"
[16] "NY" "ND" "OK" "PA" "SC" "TN" "UT" "VA" "WV" "WY"

更新

如果您更喜欢单独的向量而不是列表,请尝试:

stOdds <- key[1:length(key) %% 2 == 1]
stEvens <- key[1:length(key) %% 2 == 0]

【讨论】:

    【解决方案3】:

    这将返回所有其他元素。第一个返回以第一个开头的所有其他元素,第二个返回一个以第二个开头的向量。

    >  key <- factor(state.abb)
    > key[c(TRUE, FALSE)]
     [1] AL AZ CA CT FL HI IL IA KY ME MA MN MO NE NH NM NC OH OR RI SD TX VT WA WI
    50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV ... WY
    > key[c(FALSE,TRUE)]
     [1] AK AR CO DE GA ID IN KS LA MD MI MS MT NV NJ NY ND OK PA SC TN UT VA WV WY
    50 Levels: AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV ... WY
    

    正如其他人已经指出的那样,使用 as.character() 将转换为没有所有那些令人分心的级别的非因素对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多