当前位置: 首页 > 知识库问答 >
问题:

在数据中查找字符串。填充新列的框架

姚浩歌
2023-03-14

我在我的数据上使用dplyr来创建如下数据的子集:

dd <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L), 
`1` = c("eg", NA, NA, "eg", "eg", NA, NA, NA, NA, "eg", NA), 
`2` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, "eg", NA), 
`3` = c(NA, NA, NA, "sk", "lk", NA, NA, NA, NA, NA, NA), 
`4` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA), 
`5` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA), 
`6` = c(NA, NA, NA, "lk", "lk", NA, NA, NA, NA, NA, NA))

我现在想检查除了ID之外的每一列是否包含某些字符串。在这个例子中,我想为每个ID创建1列,其中包含一个包含“eg”和“0”的列。同样,还有一列告诉我其他列中是否有“sk”或“lk”。之后,除了ID之外的旧列可以从data.frame

对我来说,最困难的部分是使用动态数量的列,因为我的dplyr子集将根据具体情况返回不同数量的列,但我需要检查在每种情况下创建的每一个列。我想使用unite first将所有字符串放在一起,但我会遇到同样的问题:如何将除第一个ID之外的所有列合并在一起。

如果这可以在dplyr内解决,那将是完美的,但任何有效的解决方案都值得赞赏。

结果应该如下所示:

result <- data.frame(ID = c(700689L, 712607L, 712946L, 735907L, 735908L, 735910L, 735911L, 735912L, 735913L, 746929L, 747540L), 
with_eg = c(1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0), 
with_sk_or_lk = c(0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0))

共有2个答案

赏育
2023-03-14

这里有一个公认的黑客dplyr/purrr解决方案。考虑到你的ID似乎永远不会等于“eg”、“sk”或“lk”,我没有包含任何不搜索ID列的内容。

library(dplyr)
library(purrr)
dd %>% 
    split(.$ID) %>% 
    map_df(~ data_frame(
        ID = .x$ID, 
        eg = ifelse(any(.x == 'eg', na.rm = TRUE), 1, 0), 
        other = ifelse(any(.x == 'lk' | .x == 'sk', na.rm = TRUE), 1, 0)
    ))
井通
2023-03-14

根据您的描述,您希望一列检查“eg”,另一列检查“lk”和“sk”。如果是这种情况,则以下基本R方法将起作用。

dfNew <- cbind(id=dd[1],
               eg=pmin(rowSums(dd[-1] == "eg", na.rm=TRUE), 1),
               other=pmin(rowSums(dd[-1] == "sk" | dd[-1] == "lk", na.rm=TRUE), 1))

在这里,检查整个数据中是否存在“eg”。帧(id列除外)并返回一个逻辑矩阵,行和跨行添加真值,其中na。rm删除NAs,然后pmin取行和和1的输出的最小值,以便用1替换任何具有2的元素,并保留任何具有0的值。

同样的逻辑应用于“其他”变量的构造,除了在初始逻辑矩阵中检查“lk”或“sk”的存在。最后,data.frame返回一个包含所需值的3列data.frame。

此返回

dfNew
       ID eg other
1  700689  1     0
2  712607  0     0
3  712946  0     0
4  735907  1     1
5  735908  1     1
6  735910  0     0
7  735911  0     0
8  735912  0     0
9  735913  0     0
10 746929  1     0
11 747540  0     0

 类似资料:
  • 问题内容: 我想获取一列中字符串的频率计数。一方面,这类似于将数据框折叠为仅反映列中的字符串的一组行。我能够通过循环解决此问题,但知道有更好的解决方案。 df示例: 并想出去: 我搜索了很多论坛,但找不到合适的答案。 我假设使用pivot_table方法是正确的方法,但是无法获取正确的参数来折叠没有为输出df提供明显索引的表。 我可以通过使用value_counts()遍历每列并将每个值计数系列附

  • 假设我有一个整数数组,如和一个简单的字符串,如。我如何循环通过数组和填充每一个值。假设是这样的: 输出: 到目前为止,我已经尝试了以下内容: 但是,它在print语句中给出了。解决这个问题最好的方法是什么?

  • 问题内容: 我有几列的数据框。其中一个充满了用“ |”分隔的电影“流派”,我将这一列拆分为其他几列,以获取X列,每个列均填充有拆分后的值。但是,我需要为每个以1或0填充的“流派”设置1列,具体取决于该列的标题是在标称类型列还是在拆分列之一中找到的。我这样设置数据框: 但是我没有找到如何检查标头名称是否在字符串中以添加1或0的方法。 问题答案: 我认为你需要与提取塔和原来的: 如果要原始列:

  • 我如何用整数或字符串填充我的GridPane?我目前正在数独GUI上工作,无法使其工作。我已经知道不可能用Java FX标签来显示它,因为它是Java.FX.scene.Control类。我需要以某种方式将数独值转移到GridPane中相应的坐标。

  • 问题内容: 有一些简单的方法可以在Java中填充字符串吗? 似乎应该在类似StringUtil的API中使用某些东西,但是我找不到能做到这一点的任何东西。 问题答案: 有几种方法:leftPad,[rightPad](https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/Str

  • 问题内容: 有没有比下面的示例更快的方法来找到Pandas DataFrame中最长字符串的长度? 使用IPython的进行计时大约需要10秒钟。 问题答案: DSM的建议似乎是您无需进行一些手动微优化就能获得的最佳效果: 请注意,显式使用该方法似乎并没有多大改进。如果您不熟悉IPython(这是非常方便的语法所来自的地方),我绝对建议您尝试一下,以快速测试此类内容。 更新 添加了屏幕截图: